{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "import math, random\n",
    "\n",
    "import gym\n",
    "import numpy as np\n",
    "\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.optim as optim\n",
    "import torch.autograd as autograd \n",
    "import torch.nn.functional as F\n",
    "\n",
    "from common.replay_buffer import ReplayBuffer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "from IPython.display import clear_output\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h3>Use Cuda</h3>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "USE_CUDA = torch.cuda.is_available()\n",
    "Variable = lambda *args, **kwargs: autograd.Variable(*args, **kwargs).cuda() if USE_CUDA else autograd.Variable(*args, **kwargs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2>Cart Pole Environment</h2>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[33mWARN: gym.spaces.Box autodetected dtype as <type 'numpy.float32'>. Please provide explicit dtype.\u001b[0m\n"
     ]
    }
   ],
   "source": [
    "env_id = \"CartPole-v0\"\n",
    "env = gym.make(env_id)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h3> Noisy Networks for Exploration</h3>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "class NoisyLinear(nn.Module):\n",
    "    def __init__(self, in_features, out_features, std_init=0.4):\n",
    "        super(NoisyLinear, self).__init__()\n",
    "        \n",
    "        self.in_features  = in_features\n",
    "        self.out_features = out_features\n",
    "        self.std_init     = std_init\n",
    "        \n",
    "        self.weight_mu    = nn.Parameter(torch.FloatTensor(out_features, in_features))\n",
    "        self.weight_sigma = nn.Parameter(torch.FloatTensor(out_features, in_features))\n",
    "        self.register_buffer('weight_epsilon', torch.FloatTensor(out_features, in_features))\n",
    "        \n",
    "        self.bias_mu    = nn.Parameter(torch.FloatTensor(out_features))\n",
    "        self.bias_sigma = nn.Parameter(torch.FloatTensor(out_features))\n",
    "        self.register_buffer('bias_epsilon', torch.FloatTensor(out_features))\n",
    "        \n",
    "        self.reset_parameters()\n",
    "        self.reset_noise()\n",
    "    \n",
    "    def forward(self, x):\n",
    "        if self.training: \n",
    "            weight = self.weight_mu + self.weight_sigma.mul(Variable(self.weight_epsilon))\n",
    "            bias   = self.bias_mu   + self.bias_sigma.mul(Variable(self.bias_epsilon))\n",
    "        else:\n",
    "            weight = self.weight_mu\n",
    "            bias   = self.bias_mu\n",
    "        \n",
    "        return F.linear(x, weight, bias)\n",
    "    \n",
    "    def reset_parameters(self):\n",
    "        mu_range = 1 / math.sqrt(self.weight_mu.size(1))\n",
    "        \n",
    "        self.weight_mu.data.uniform_(-mu_range, mu_range)\n",
    "        self.weight_sigma.data.fill_(self.std_init / math.sqrt(self.weight_sigma.size(1)))\n",
    "        \n",
    "        self.bias_mu.data.uniform_(-mu_range, mu_range)\n",
    "        self.bias_sigma.data.fill_(self.std_init / math.sqrt(self.bias_sigma.size(0)))\n",
    "    \n",
    "    def reset_noise(self):\n",
    "        epsilon_in  = self._scale_noise(self.in_features)\n",
    "        epsilon_out = self._scale_noise(self.out_features)\n",
    "        \n",
    "        self.weight_epsilon.copy_(epsilon_out.ger(epsilon_in))\n",
    "        self.bias_epsilon.copy_(self._scale_noise(self.out_features))\n",
    "    \n",
    "    def _scale_noise(self, size):\n",
    "        x = torch.randn(size)\n",
    "        x = x.sign().mul(x.abs().sqrt())\n",
    "        return x"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h1>C-51 Algorithm</h1>\n",
    "<h2>A Distributional Perspective on Reinforcement Learning</h2>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "class CategoricalDQN(nn.Module):\n",
    "    def __init__(self, num_inputs, num_actions, num_atoms, Vmin, Vmax):\n",
    "        super(CategoricalDQN, self).__init__()\n",
    "        \n",
    "        self.num_inputs = num_inputs\n",
    "        self.num_actions  = num_actions\n",
    "        self.num_atoms    = num_atoms\n",
    "        self.Vmin         = Vmin\n",
    "        self.Vmax         = Vmax\n",
    "        \n",
    "        self.linear1 = nn.Linear(num_inputs, 128)\n",
    "        self.linear2 = nn.Linear(128, 128)\n",
    "        self.noisy1 = NoisyLinear(128, 512)\n",
    "        self.noisy2 = NoisyLinear(512, self.num_actions * self.num_atoms)\n",
    "        \n",
    "    def forward(self, x):\n",
    "        x = F.relu(self.linear1(x))\n",
    "        x = F.relu(self.linear2(x))\n",
    "        x = F.relu(self.noisy1(x))\n",
    "        x = self.noisy2(x)\n",
    "        x = F.softmax(x.view(-1, self.num_atoms)).view(-1, self.num_actions, self.num_atoms)\n",
    "        return x\n",
    "        \n",
    "    def reset_noise(self):\n",
    "        self.noisy1.reset_noise()\n",
    "        self.noisy2.reset_noise()\n",
    "    \n",
    "    def act(self, state):\n",
    "        state = Variable(torch.FloatTensor(state).unsqueeze(0), volatile=True)\n",
    "        dist = self.forward(state).data.cpu()\n",
    "        dist = dist * torch.linspace(Vmin, Vmax, num_atoms)\n",
    "        action = dist.sum(2).max(1)[1].numpy()[0]\n",
    "        return action"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "def projection_distribution(next_state, rewards, dones):\n",
    "    batch_size  = next_state.size(0)\n",
    "    \n",
    "    delta_z = float(Vmax - Vmin) / (num_atoms - 1)\n",
    "    support = torch.linspace(Vmin, Vmax, num_atoms)\n",
    "    \n",
    "    next_dist   = target_model(next_state).data.cpu() * support\n",
    "    next_action = next_dist.sum(2).max(1)[1]\n",
    "    next_action = next_action.unsqueeze(1).unsqueeze(1).expand(next_dist.size(0), 1, next_dist.size(2))\n",
    "    next_dist   = next_dist.gather(1, next_action).squeeze(1)\n",
    "        \n",
    "    rewards = rewards.unsqueeze(1).expand_as(next_dist)\n",
    "    dones   = dones.unsqueeze(1).expand_as(next_dist)\n",
    "    support = support.unsqueeze(0).expand_as(next_dist)\n",
    "    \n",
    "    Tz = rewards + (1 - dones) * 0.99 * support\n",
    "    Tz = Tz.clamp(min=Vmin, max=Vmax)\n",
    "    b  = (Tz - Vmin) / delta_z\n",
    "    l  = b.floor().long()\n",
    "    u  = b.ceil().long()\n",
    "        \n",
    "    offset = torch.linspace(0, (batch_size - 1) * num_atoms, batch_size).long()\\\n",
    "                    .unsqueeze(1).expand(batch_size, num_atoms)\n",
    "\n",
    "    proj_dist = torch.zeros(next_dist.size())    \n",
    "    proj_dist.view(-1).index_add_(0, (l + offset).view(-1), (next_dist * (u.float() - b)).view(-1))\n",
    "    proj_dist.view(-1).index_add_(0, (u + offset).view(-1), (next_dist * (b - l.float())).view(-1))\n",
    "        \n",
    "    return proj_dist"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "num_atoms = 51\n",
    "Vmin = -10\n",
    "Vmax = 10\n",
    "\n",
    "current_model = CategoricalDQN(env.observation_space.shape[0], env.action_space.n, num_atoms, Vmin, Vmax)\n",
    "target_model  = CategoricalDQN(env.observation_space.shape[0], env.action_space.n, num_atoms, Vmin, Vmax)\n",
    "\n",
    "if USE_CUDA:\n",
    "    current_model = current_model.cuda()\n",
    "    target_model  = target_model.cuda()\n",
    "    \n",
    "optimizer = optim.Adam(current_model.parameters())\n",
    "\n",
    "replay_buffer = ReplayBuffer(10000)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h3>Synchronize current policy net and target net</h3>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "def update_target(current_model, target_model):\n",
    "    target_model.load_state_dict(current_model.state_dict())\n",
    "    \n",
    "update_target(current_model, target_model)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2>Computing Temporal Difference Loss</h2>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "def compute_td_loss(batch_size):\n",
    "    state, action, reward, next_state, done = replay_buffer.sample(batch_size) \n",
    "\n",
    "    state      = Variable(torch.FloatTensor(np.float32(state)))\n",
    "    next_state = Variable(torch.FloatTensor(np.float32(next_state)), volatile=True)\n",
    "    action     = Variable(torch.LongTensor(action))\n",
    "    reward     = torch.FloatTensor(reward)\n",
    "    done       = torch.FloatTensor(np.float32(done))\n",
    "\n",
    "    proj_dist = projection_distribution(next_state, reward, done)\n",
    "    \n",
    "    dist = current_model(state)\n",
    "    action = action.unsqueeze(1).unsqueeze(1).expand(batch_size, 1, num_atoms)\n",
    "    dist = dist.gather(1, action).squeeze(1)\n",
    "    dist.data.clamp_(0.01, 0.99)\n",
    "    loss = - (Variable(proj_dist) * dist.log()).sum(1).mean()\n",
    "        \n",
    "    optimizer.zero_grad()\n",
    "    loss.backward()\n",
    "    optimizer.step()\n",
    "    \n",
    "    current_model.reset_noise()\n",
    "    target_model.reset_noise()\n",
    "    \n",
    "    return loss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot(frame_idx, rewards, losses):\n",
    "    clear_output(True)\n",
    "    plt.figure(figsize=(20,5))\n",
    "    plt.subplot(131)\n",
    "    plt.title('frame %s. reward: %s' % (frame_idx, np.mean(rewards[-10:])))\n",
    "    plt.plot(rewards)\n",
    "    plt.subplot(132)\n",
    "    plt.title('loss')\n",
    "    plt.plot(losses)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2>Training</h2>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAv4AAAE/CAYAAAA+Occ1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XmcHHWdP/7Xu7q6e47M5JwcQEIAAQWFoBFcFUXBFbzw\n2HVB15NdxGu/u8tvXbzxYEVZ0VUORcDgAQoCgnITSULCGY4EQsh9k2Qm11x9VVd/fn9Ufaqre/qo\n7ulrZl7PxyOPdFdXVX9mMpl+17ven/dHlFIgIiIiIqLxzWj2AIiIiIiIqP4Y+BMRERERTQAM/ImI\niIiIJgAG/kREREREEwADfyIiIiKiCYCBPxERERHRBMDAfxwQkeNF5HkRGRSRf2v2eKi+ROTTIrK8\n2eMgIhpvRGSriJzV7HEQ1QsD//HhKwAeUUp1KaV+1uzB5BOR60RknYhkROTTBV7/DxHZIyIDInKj\niER9r00TkTtFZFhEtonIx/KOPVNEXhaRmIg8IiJH+l4TEfmhiOx3//xQRKSuX2wLKvX9dy8ibBEZ\n8v05I2+f80RkrftvsElETi/yPmXPRURERM3DwH98OBLAmmIvikiogWMpZBWALwB4Nv8FEXk3gEsA\nnAnn6zgawHd8u1wNIAVgFoCPA7hWRE50j50B4A4A3wQwDcBKAH/0HXshgA8COBnASQDeD+Bz1XwB\nImJWc9xo1ejfruj33/W4UmqS788S3/u/C8APAXwGQBeAtwHYXOK9ip6LiIiImouB/xgnIn8D8A4A\nV7kZ1uNEZJGIXCsi94rIMIB3iMh7ReQ5N6u+Q0Qu9Z1jvogoEfmM+9pBEblIRN4oIqtF5JCIXJX3\nvp91s8AHReQBf6Y9n1LqaqXUYgCJAi9/CsANSqk1SqmDAL4L4NPue3QC+AiAbyqlhpRSywHcBeAT\n7rEfBrBGKXWbUioB4FIAJ4vIq33n/rFSaqdSaheA/9XnDvB9/bSIrBCRn4jIfvfcRb9uEfmOiPzc\nfRx2s+NXuM/bRSQhItPc57e5dzj6RWSZvpBxXyv0bzddRO52/+2eAnBMkK9BK/P9L+c7AL6rlHpC\nKZVRSu1yv5dEROOWiERF5Kci8or756f6brSIzBCRv7qfjQdE5FERMdzX/ltEdolTertORM5s7ldC\nlIuB/xinlHongEcBfMnNsK53X/oYgMvgZGmXAxgG8EkAUwC8F8DnReSDeac7DcCxAP4JwE8BfB3A\nWQBOBPBREXk7AIjIuQC+Bifw7nHf/5Yqv4QT4WSktVUAZonIdADHAUj7vib9+omFjlVKDQPYWOz1\nvGODOA1OdnsWgMvKfN1LAZzhPn4jgD1wsuMA8HcA1imlDrjP74PzfZ4JJwv/+7z3zf+3uxpO0D4H\nwGfdPx73A+iSCr6ufKeIyD4RWS8i39R3N9y7DQsB9IjIRhHZKSJXiUh7peciIhpjvg7gTQAWwLlr\nfCqAb7ivXQxgJ5zPgVlwPheUiBwP4EsA3qiU6gLwbgBbGztsotIY+I9fdymlVrhZ2oRSaolS6gX3\n+Wo4Aevb8475nrvvg3AuFG5RSvW6Gd5HAZzi7ncRgB8opdYqpdIA/gfAglJZ/xImAej3PR9w/+5y\nXxvI23/Afa3QseVeHwAwSSRwnf8rSqmfK6XSSqk4Sn/djwM41r1geRuAGwAcLiKT4Hyfl+qTKqVu\nVEoNKqWSyN6lmOx7X+/fDoAF567Ht5RSw0qpFwHc5B+kUup9SqnLA35N+ZYBeC2ci5CPADgfwH+5\nr80CEAbwDwBOh/MBeAqyH36VnIuIaCz5OJy7nb1KqT44dz/13WYLTiLmSKWUpZR6VCmlANgAogBO\nEJGwUmqrUmpTU0ZPVAQD//Frh/+JiJwmzuTXPhHphxPEzsg7Zq/vcbzA80nu4yMB/J97m/MQgAMA\nBMDhVYxzCEC377kOgAcLvKZfHyxybLnXJwMYcn9BB7Ej73nRr9u9MFgJJ8h/G5xA/zEAb4Ev8BeR\nkIhcLs4k2QFks0H+fwv/+/YAMPO2bQs4/rKUUpuVUlvcC8IX4JRa/YP7ctz9++dKqd1KqX0ArgTw\nnirORUQ0lhyG3N+129xtAHAFnLvLD4rIZn3HVSm1EcC/w0no9IrIH0TkMBC1EAb+41d+cHszgLsB\nzFVKTQbwCzhBazV2APicUmqK70+7UuqxKs61Bs5tVO1kAHuVUvsBrAdgisixea+vKXSsOyfgmGKv\n5x0bRP73sNzXvRTAO+FkxZ92n78bzi3iZe4+HwNwLpwSqskA5uvhF3nfPgBpAHN92+ZV8DVUSumx\nuHMuduaNJ+hFU865iIjGmFfgJHu0ee42uHdsL1ZKHQ3gAwD+U9fyK6VuVkq91T1WwWmOQNQyGPhP\nHF0ADiilEiJyKpwAtFq/APBVyXbXmSwi/1hsZxGJiEgbnCAwLCJteiIUgN8AuEBEThCRqXA69CwC\nvJr9OwB8V0Q6ReStcH7J/tY99k4ArxWRj7jn/zaAVUqpl33n/k8ROVxEDodTl7mojl/3UjjzKF5S\nSqUALAHwLwC2uLeKAeffIQlgP4AOOOVCRSmlbDjfg0tFpENEToAzaTmwUt9/ETlHRGa5j18N5/t/\nl+/wXwP4sojMdP99/gPAX4u8T7lzERGNFbcA+IaI9IjTQe5bAH4HACLyPhF5lVs22g+nxCcjzpo6\n73QnASfg3DXNNGn8RAUx8J84vgAngB6E8wvs1mpPpJS6E04W4w9uucqLAM4pcciDcH4BvhnAde7j\nt7nnuh/AjwA8AudW6hY4Abx/3O0AeuHctfi8UmqNe2wfnFryywAchJNZP8937C8B/AXAC+6fv7rb\nAAAiskZEPl7Dr/sxd6w6u/8SnF/+y3z7/Mb9One5rz8R4K2/BKfMag+cC5df+18UkftE5Gslji/6\n/YfTRnW120HoXjgXGf6Lke/BuXuxHsBaAM/B+X5DROaJ00lqXsBzERGNFd+HU765Gs7nx7PuNsBp\nzvAwnHLSxwFco5R6BE59/+UA9sH5fT0TwFcbO2yi0iR4uTMREREREY1VzPgTEREREU0ADPyJiIiI\niCYABv5ERERERBMAA38iIiIiogmAgT8RERER0QRgNnsAADBjxgw1f/78Zg+DiKglPfPMM/uUUj3N\nHkcz8XOCiKiwSj4jWiLwnz9/PlauXNnsYRARtSQR2dbsMTQbPyeIiAqr5DOCpT5ERERERBMAA38i\nIiIiogmAgT8RERER0QTAwJ+IiIiIaAJg4E9ERERENAEw8CciIiIimgAY+BMRERERTQBlA38RmSsi\nj4jISyKyRkT+n7t9mog8JCIb3L+n+o75qohsFJF1IvLuen4BRERERERUXpCMfxrAxUqpEwC8CcAX\nReQEAJcAWKyUOhbAYvc53NfOA3AigLMBXCMioXoMnoiIiIiIgim7cq9SajeA3e7jQRFZC+BwAOcC\nOMPd7SYASwD8t7v9D0qpJIAtIrIRwKkAHq/14ImoPp7YvB8L5k5BW9i5Zt+2fxiPbdoPADhiajtO\nPzbQyuAAAKUUlm/ch7ccMwOGIQCATX1DiIQMzJ3WUfS4p7YcwKa+IQDAG46ciuNmdRXd98Vd/ejp\nimJWdxsAoD9m4YE1e2ArVXJsJ8zpxslzp4zYvmLjPmw/EMvZdtysSXjDkdNKng8ADg6nsP1ArOB5\nqXn6BpPoHUzgxMMmN3soRERNUzbw9xOR+QBOAfAkgFnuRQEA7AEwy318OIAnfIftdLfln+tCABcC\nwLx58yoZBhHV0b6hJM677gn86B9OwkcXzgUA/ODel3H/mj0AAEOAl757tndRUM7a3YP4xA1P4XcX\nnIa3HjsDAPCVP63GtM4IfvXJhUWP+9ffrER/3AIAnDJvCu78wlsK7pdKZ3D+dU/gAwsOw2Ufeh0A\n4PdPbcOP7l9Xdmxzp7Xj0a+8M2dbwrLxyRufgp3JvWiY2RXFU18/q+w5b1yxBYtWbMUL32GVYys5\n68ql6I9b2Hr5e5s9FCKipgkc+IvIJAC3A/h3pdSAiHivKaWUiJROreVRSl0H4DoAWLhwYUXHElH9\nxJI2AGD/UMrbdiCWwuvnTcG7TpiNH97/MgbiVuDAfyiZBgAcimfPdyiWQjgkxQ4BAMRTNj75d0di\nKJHGI+t6i+63cusBDCbT2DeU9LbtH0qhIxLC3y4+o+hx1yzZiFue2g6lFPy/z3oHkrAzCt9472vw\nvpMOAwD83+L1+Muq3cVOlePAcApDqXSgfalx9EUkEdFEFijwF5EwnKD/90qpO9zNe0VkjlJqt4jM\nAaA/mXcBmOs7/Ah3GxGNASk7AwAYSGQDpYG4hbnTOnD41HbvtZluWU05afd8sZTtbYunbCTTmaLH\nKKWQsjOY0hHBYVPaccdzuzCYsNDVFh6x75L1fQByA7v+uIUp7WHMnlx8jEdO74RlKxyKWZjaGfG2\n7+6PAwCOn93lHT+5PeJ9X8qJp2woBdgZhZBR+uKGiIiokYJ09REANwBYq5S60vfS3QA+5T7+FIC7\nfNvPE5GoiBwF4FgAT9VuyERUTyk3IB/wBdKDiTS628LobnNyBf3x4BltHTAnLF/gb9lIWsUDaV1m\nEwkJ5k515gHsOBAvuO8S926Af0z9cQvd7SMvEvxmdkUBAH2+OwUAsGcgAQCY7buwiYQElp2BKjNn\nAACG3Wy/FfBCgYiIqFGCdPV5C4BPAHiniDzv/nkPgMsBvEtENgA4y30OpdQaALcCeAnA/QC+qJSy\nC5+aiFqN5WX8s4H0QMJCd7vpBdODieBlE2nbCZbjqbzAP13814LlHmOGDMxzJwDnT7YFgF2H4li/\ndwghQ3IuVIIE/j1u4N87kBf497uBv+9uQThkeFn8cvSdjXSAfYmIiBopSFef5QCK3a8+s8gxlwG4\nbBTjIqIm0YG/Du4zGYWhZBpdvoy//6KgnHQmt9Qnk1FIWJmSpT6We0zYF/jvKBD462z/W141A89u\nO+ht16VJpWQz/omc7XsGEuiMhHLKisKmkyOxbAWzzNSGYXdOQ5oZfyIiajFcuZeIcng1/m4GfTCZ\nhlJAd5uJbjcYHqhgoqTO3utSn4Sb6S8Z+Kd14C+Y3OFccBTK+C9Z14fDp7Tj9fOmYCiZ9oLt/riF\nyaPI+OfPDQiHnF+VQer89QWO/rqJiIhaBQN/Isrh1fi7WX0d5He3h73ymYEKSn2svMm9+u+kVb7U\nRwfc86Z3jAj8U+kMVmzchzOO7/GCfD3mIIH/pKiJ9nAIfYMja/zzA/+I24EoSN0+a/yJiKhVMfAn\nohw66PYy/m4w3d0WRtQ0EA6Jty0Ir8bfDfR1rX/JjL8bNJtuV5x50zqw42Bu4N87mEAsZeOkIyZ7\nQX5/3IJlZxBL2WUDfxFBT1d05OTe/gRmd7fnbIt4pT4BMv5uO9Q0M/5ERNRiGPgTUY5sjb+b8Xez\n+91tJkQE3W3hykp93Hp9HfDrC4BkuniXHD0GHXDPndaBnQfiyPgmzOo7E23hUE7gr8dWLvAHnDp/\nf6mPnVHoHUxi9uRozn5eqU+JixXNy/hnmPEnIqLWwsCfiHLo4DZu2UilMzmlPvrvSib3Wr7zAbnd\nfYrVzOuOOKbhBv5TO5CyM9g7mJ2Iq+8YREJGTuDfX0Hgn5/x3zfkLN41e3Juxl8H/uUy/rY7cRlg\nxp+IiFoPA38iyuEPxgcTVk6pDwB0tZmVtfN0g/iYmwn3L+RVrNwn5ZvcCyDb0nN/bMQ+EbP6wN/J\n+GcvJrxWnt1FJvemSwfzcd+8Bdb4ExFRq2HgT0Q5rJzAP+2V+nS5rTwrLvXxavxHLuRVbBEvPQbd\nRrNQL/+UXTrwL9fHH3Ay/gOJtDcmvXjXnPzJvWawyb2xZPZOCPv4ExFRq2HgT0Q5LF8WfiBhYcBd\nEdcL/NvNykp9bF3jXyjjX7izjw6aw26pz2FT2mFIbi//lK/Ux+s2VEWpDwCvs4/O+M8qkvEvF/gP\n+7429vEnIqJWw8CfiHL4S30G4mkMJix0RkIw3eC3KxqucOXevBp/q3ypj5VX6hMxDcyZ3I4dB+PZ\ncbr7RMMhtIVDiJoGBiqe3OsE+LrOf89AAuGQYHpnJGe/oH38h30Zf/bxJyKiVlN25V4imlj8AetA\nwsJAwspZxba73fTuAgQ6n5u997r6pLLHFi310ZN7Q9ncxLxpub389d2CiLvP5PYw+uNWzp2Jcgpl\n/Gd2tcEwchcrz2b8Swfz/rsZaXb1ISKiFsOMPxHl8LesHHRLffxBdHdb2Ov4E4SX8U8Vyvg7j3sH\nE7jigZe9dp2Wr4xHmzetA9v2+wP/3Jaf3W7g3x+30BY2EDVDZcc2U6/e6wv88+v7/eOwynzNwyl/\nxp+BPxERtRYG/kSUY0SpT9LyOvoA2UmzQct9dJY8ZtlQShXs6vPIy724+pFN2OZm9HW23AxlM+89\nXVEcGM623vRKfczcjH+QVXu1aZ0RiPgy/gMJzCoU+AdcwEsv3uXsy1IfIiJqLQz8iSiHlc6gPRyC\nIdnJvf4OObqUJujqvTpYVsoJ9AvV+OuLAb1vyg2aw76Mf9Q0kFHZOwipvEW+dOA/EE8HDvzNkIHp\nnVH0DSaglHIy/t0jA38916BcjX/Ml/FnH38iImo1DPyJKIdlZxANG5gUNZ3Jsols3TyQ7ec/EDDj\n7w+AE5aNhD/jnzfhV2fxC5X6tIWd0h19sVCLjD/gLuI1mMRAPI24ZWN2gYx/0JV7WePf+vpjFn5w\n71qWYhHRhMTAn4hypGyFsNsiczCRxkC8cKlP0Am+/gArlrILlvro+n/9vFCpTzTs/LrSPffza/yr\nDfxndkXRO5jExr4hACgY+GdLfUpn8XNr/Jnxb0X/9ofn8Mtlm/HX1a80eyhERA3HwJ+IcqTSGac3\nfpsTSA8mcif3Zkt9Atb4+xayils24pbtlc7kB/7lSn38x6Ty7groC5VDsVSgxbu0nq4odh6M4+Jb\nn8e0zghOPWraiH2C9vH31/izj39rWrq+DwBLsYhoYmLgT0Q5LDuDiGmgu93E3sEE0hmV186z0lKf\nbAAcT9mIp2xMbnf65OuuPrG8Uh99TNif8TdHlvoYkm35qbP8ewYSFWf8Dwyn8Ep/Ar/65EKvt7+f\nHkf5Bbx8GX+u3NvS+K9DRBMRA38iymHZGYRDgq62MHa5C2bllPq4Gf9qSn10xn9qh3M+3cdf1/17\nNf5e4F8o4+/u616gaDrYz6hgi3dpc6d1AACu/OjJeMORUwvuE3QBr1jS9sbJjH+LY+RPRBMQF/Ai\nohxO4O+U+hyMOVl9f6lPZ8SESOXtPIFsjf8UHfgX6eqjjylU468vFpKWndOr3x/sVxL4f+T1R+C0\no6bh6J5JRffxSn3SI6PFCxY9jfedPAcfOuUIDKecjkK9g0mWkrQ4xcifiCYgZvyJKEcy7Qb+7SM7\n+QCAYQi6oiYGArbzTGcy6Ig4AXo8ZSNhjSz18br62HkZf8Of8c8r9SmS8c9/XE7ENEoG/QAQMgQh\nQ0aU+iTTNha/3IvHNu4H4FzA6Pcud3eAiIio0Rj4E1EOXePvr+v3t/MEnDr/gXjwjL++cIhbacRS\nNiZFQwiHpGhXH8vOIGQIDCOb8W8L55b6JN1JyFq1gX9Q4dDIwL93wFn4S6/8G0tl1xBgxr+1Kf7z\nENEExMCfiHJYtnK7+vgy/nmBdFdbOPDkXsvOeHcP4ilnAa/2iImoGfLKdnTGXwfWaVvlTOwFfBl/\nKzu5N+rL+OfcoahD4B8JGSOy+L2DCQDZlX9jKRuT2pxSKPbxJyKiVsPAn4hypNLO5F5/8Owv9XGe\nV1DqY2e7AsVSacRTNtrDIURNY2Spj6+Mxz+xF8hO7k2ks/vWotQnqIhpjFjAa29exn84mUZnxETY\nMNjHn0aw7Ix3d4uIqBnKBv4icqOI9IrIi75tfxSR590/W0XkeXf7fBGJ+177RT0HT0S157XzbBvZ\nu1+rrNQn450rnrLdjL/hBv6F+/in3UXE/PIz/sm8jH97OOTdJahPqY8xotRn74CT8T8wnISdUYil\nbHREQjBDwq4+La4Zl2X/fP2TeM237m/COxMROYJk/BcBONu/QSn1T0qpBUqpBQBuB3CH7+VN+jWl\n1EW1GyoRNULK19UHcDLdbeFQzj5dbSYGA2b8LTuDjogJ0xAMJCzYGYWOiIloOJQN/K2R7TxHlPqE\nRy7g5c/4i4gX8Ncv8M8NF3XGP6OA/cNJJ+MfNREOGUizjz+AosmjS0Vkly9J9J5Gj2vdnsFGvyWe\n3HKg4e9JRORXNvBXSi0DUPC3lYgIgI8CuKXG4yKiJrFsd+VeN3jOL/PR2wIv4JVRMEOC9nAI+4dT\nAIA2XerjBvwxd+Erf6mPaRQu9SnWxx9w7kQUulCphXBIRtb4uxl/53HSy/gXmgg8gS1CXvLI9RNf\nkujeBo8Jix7b2ui3JCJqutHW+J8OYK9SaoNv21FuBmepiJw+yvMTUYOl0rkZf/+kWa27PYyhZBqZ\nAFnttK1gGgbaIyEccAP/jkjIK/XJZBQSesKum1FP22pEUF9o5d5IXjnQ5PZwXbL9gJvxz6/xH0x4\ndyZ2HYojnVHojJowDYNdfVylkkdERNRYow38z0dutn83gHluCdB/ArhZRLoLHSgiF4rIShFZ2dfX\nN8phEFGtWG7Qrev6uwpm/E0oBQwmy5f7OJl5yQn8ncm9ISTTtjdZF8gt9TGN/K4+uQt45Zf6AMDU\njgim1Cnwj5iFavyTOH52FwBg2/5hAPBq/JnxL+vLIrLaLQUqvGQyERHVVNWBv4iYAD4M4I96m1Iq\nqZTa7z5+BsAmAMcVOl4pdZ1SaqFSamFPT0+1wyCiGrPcjL8O/LvbCmT83YuBIBN8027ZTns4hP1D\nbuAfCSEadjL+/i4nKVtP8h05udcwBJGQ4evjn7tyLwB8+Z2vwjffd0LQL7UihWv8E3jtYZMBAFv3\nxwA4KxuHQwYs1viXci2AowEsgJMw+nGhnZggIiKqrdFk/M8C8LJSaqfeICI9IhJyHx8N4FgAm0c3\nRCJqpKSdQdgUmCEDnZFQwZ74uvwnyATftO3W+I/I+BtIWhnEfIG/lXaC5UKTewEn658okfE/Zd5U\nvO24+iQS8mv84ykbg4k05k3vQFebmc34R0MwDXb1KUUptVcpZSulMgB+BeDUIvsxQUREVENB2nne\nAuBxAMeLyE4RucB96TyMnNT7NgCr3faefwJwkVKKtZ1EY4RSCpadQdTNth/dMwlHz+gcsd+kqHMx\nMBhggq+Vce4gdERCXvcep8bfLfWx/Bl/t51nZmQffwDuXYLik3vrKb+dp168a2ZXG3q6oti6L5vx\nNwvcHaAsEZnje/ohAC8W25eIiGpn5D38PEqp84ts/3SBbbfDae9JRGOQnVFQCl7Q/afP/92I7joA\nvIA7SHBruavwtvs67XhdfdK5GX+vxj89stQHgHuxkO3jnz+5t56ipoEDw9nAX7fynNUdxcyuqNeq\nsd3t6sOVex1u8ugMADNEZCeAbwM4Q0QWwGmnvxXA55o2QCKiCaRs4E9EE4cO5MNuYJ9fQ6/pwF/X\n5BejlIKdcbr6+Ftsdvhr/Atk/FN2Bl3hkb+e/It+5S/gVW/5GX+9eNes7jb0dLVBuddAne6aBezq\n4yiSPLqh4QMhIqJRd/UhonFEZ9wLZdv9dKY9lS6d1fYuJEKCjkg28G/XpT6W7U3uFcmeL50pnM2P\nuL3/lVJINSXwzwbzXuDf1YaZXVFve0c0VHCVXyIiomZj4E9EHp1xL1c7HzHF3b90VlsHv+GQkVPq\n0+4r9dEZ/66omVPqYxaa3Ouu9qsD8EbX+PsvdHoHk4iaBrrbTfT4An/d1Ycr9xIRUath4E9EHh2o\nRwoE3X6RkBPEl8v463IXM2SgPZIt3WmPjKzx724Pe+9vFZnc22Y6k3uDXqDUUsSUEaU+s7rbICIj\nMv5miF19iIio9TDwJyJP4FIfM2CpT0afLzu51xCnVCjqPu931wKY0hH2AnqnnWehrj4hJKyM976N\nnNxbqMZ/VrcT8Psz/h3hEEzDKHs3hIiIqNEY+BORx1+aU4rusV+ujt3L+BuGV+PfETEhIl59fn/M\n6e0/uT2crfF3OwHl03cJdEvPaLjw5ON6yK/x7x1IYmZ3G4Bs4B81DZghw+nqw4w/ERG1GAb+ROQJ\nXuMfdHJvNuPf5gb+uruPDvwPxpyMf3dbbsbfLNjO0y31aVLGP2Xn1vjP6nIC/5nu351Rp5zJZI0/\nERG1IAb+ROTxJs0GLfUpk9X230HoCOuMvw78nb8PxS1ETGfyrw7oU0V69DudgHylPo2s8Q85Nf5K\nKQwl0xhKpjHTLfWZ0h6GaWQ7F4UNYVcfKukTNzyJ+Zfc0+xhENEEwz7+ROQJWuMfNoJl/HXW2wyJ\nF6TrWv9o2Hl+KJZCeziEiGn42nkWKfUJ61Kfxgf+4ZABpZyx9Q06i3fpSb2GIejpiqIzojP+7ONP\npT26YV+zh0BEExADfyLyWAFLfQxDEA5J2Yy//0LCC/wjuaU+h2IWOiK5ve/Llfo0I/DPrlacwWDC\nKU+a3B72Xu/pisIQ52LFKfVhxp+IiFoLA38i8qR8NfnlRPL62heiM/7+rj5ext8t9TmYl/FXSsGy\nVeGuPqbTx1+/b6MX8AKcNQaGk87k4g5fi9IL3noUMipbKmUx409ERC2GgT8ReYKW+gBA2Cy/Oq3u\nbJPb1Sc3498fszBvegciphMsexcLxsiLj7awc3HgdfVpZODvm9cwnEwDADqj2a5C5y443HtsGuzq\nQ0RErYeTe4nIE7TUBwiW8dd3EExfxl9399E1/oPJNNrDIa9rjnfxUWAM+i7BYCLtjqFx7Twjvham\nwynn/f0Zfz8zZMBiVx8iImoxDPyJyJNduTdA4G8GKPXxdQnStf0deaU+QHYlXwDeSr5mgYy/3scL\n/JtR6mNnVxv2Z/xz92VXHyIiaj0M/InIY6XdMpugGf9ypT4ZnfE3sjX+eaU+gFP3ry82YqniQb2+\nSzDgTq5tVuCfLfUpkvE3nA5ANrP+RETUQhj4E5EnWcnk3gAZf8tbuVe8gD9/ci8At6uP85564qxp\nlCr1sdzWIT4OAAAgAElEQVTnjQ/8U2nlZfw7iqwcbAZc2ZgmJqV4QUhEzcHAn4g8lu6WE6B2PmKW\nz/j75wy0mSH0dEUxd1qH8x5hX8Y/EkLEDep1xr9gH/8mlvpETF+NfzKNqGkUbDkKZMfO1Xtbx/mn\nzmv2EDyM+4moWdjVh4g83kq7ZvmMv7/vfjFpX8bfMATL/usdXrDuz9a3ue08AWDYzaYXLPVpgRr/\nlDu5t1iZD5C9W8HOPq1Dyv9INwzjfiJqFgb+ROSppJ1nkK4+3oVEKHfxLqBUqY8T1Bcq9WkL55b6\nBJmEXCsRr49/BrGk7bUlLSTslfowxKORWOpDRM3CUh+icWjHgRge27iv4uMsr+9+jWv8C5TtRPIm\n9+psvg78S5X6DMR1O88m9fFPpTGpRMZfX+hw9V4qhGE/ETULA3+iceiG5Vvw+d8/W/FxKVshYhqQ\nAHURTt/90iGMDnwL3UEIGeIF9+0R07sQ0BNnC67c62b8BxIWIiEDRoALlFrxMv62M7m3VMZf1/6n\nmfEnIqIWwsCfaBwaTKQxkLCQqXByqWVnAmfRo6aBlLuCbvHz6VV4C59Tl/voBbwAeItjFQz8fTX+\njazv94/HsjMYSpau8Q+zqw+VwEofImoWBv5E41AibUOpbBAdVCqdCdTKE6isq0+hUh8gG8h3RLJ9\n/L0a/1KlPgmrCYF/NpgvV+Ov5yewxr915AfbUzvCzRkIAMViHyJqkrKfnCJyo4j0isiLvm2Xisgu\nEXne/fMe32tfFZGNIrJORN5dr4ETUXFJy8nE6+43dkbhZ4s34FAsVfI4y84EmtgLuKvTpsuU+til\nJwvrQD6nq0+yfKnPUDLd0Pp+/3hSaberT6REVx9m/FvaPy2c2/ALRz9m/ImoWYL85lsE4OwC23+i\nlFrg/rkXAETkBADnATjRPeYaESnfEJyIairuBv5DbvZ8/d5BXPnQeixZ11fyuJSdCRwQBcv4u6U+\nxTL+biDvdPXJW7m3RKmPUo1t5Qlk30/X+Acp9WEf/9bUSq09iYgaqewnp1JqGYADAc93LoA/KKWS\nSqktADYCOHUU4yOiKiQsJyDXbS/7487fyTI1+al08Br/SCjkLfhVTDqTQciQopOFdSDfHvF39XFX\n7i1wsdAWDo04tlH8Nf7DyTQ6ouVLfdjHv/Vc+dGTmz0EZvyJqGlG88n5ZRFZ7ZYCTXW3HQ5gh2+f\nne42ImqghJvxH3BLfQa8wL98TX7gUh9TkAyQ8S/VGtQL/HMW8Co/uRdofMZfZ/FjKRvJdCZgqQ8j\nvFbS0xXFh19/BIDWCb7Z05+IGqnaT85rARwNYAGA3QB+XOkJRORCEVkpIiv7+kqXHxBRZbxSHx34\nu38nrfKBetCAOuou4FUqcCnXJcjr6uMv9fFq/EdeMJiGQF9HNKurz6G4M0+i9AJe7OPfyppd6uOf\n3Mu4n4gaqapPTqXUXqWUrZTKAPgVsuU8uwDM9e16hLut0DmuU0otVEot7OnpqWYYRFRE0iv1cQL+\noKU+TsY/eFcfoHQde9pWRTv6AEA0XFnGX0S8i4VGT+7V79cfc76XpWr89V0O9vGnQvzBPn9CiKiR\nqvrkFJE5vqcfAqA7/twN4DwRiYrIUQCOBfDU6IZIRJVKeF19nCBVl/okymT8k+lKuvpku9wUY9kZ\nbzGrQnLaeeYt4FW0Bah7sdDojL9hCExDcChA4O+fD0CtqZkBt/+9WepDRI1U/JPLJSK3ADgDwAwR\n2Qng2wDOEJEFcH5/bQXwOQBQSq0RkVsBvAQgDeCLSqnSKUYiqrn8rj4DieAZ/0klAlo/HXin0hl0\nRoudTwUq9fFP2tVjLnacvljQxzZSOGR4pT6dAUp9WOPfqppb6/O9v7zkPWbjJyJqpLKf8Eqp8wts\nvqHE/pcBuGw0gyKi6imlfBl/PbnXrfEPMLk3cFcfs3xWO53JlC71MQ0Y4vytE58xbwGv0qv9Nrqr\nD+DMO9AZ/44Ak3tZ49/a+gaT+NLNz+Kaj78e0ycVuXqtgz+uzPbA+MnD66EUcM5rZ+PkuVMaNgYi\nmpi4ci/ROGPZyssiDuS38yxT6pOqotSn1MWEZWdKd/UJG2gPhyAiXilNzCo+uRfIBvzNWIApYhq+\nUp8SGX+u3NvylAIWPbYFT245gJuf3N60cVy7ZBN+sXQTzr16RdPGQEQTR7B7+kQ0ZugyH8Df1Sdo\nqY9COGhXH13qUyLjb9mq5IXEm4+ZAdtX6xAOGUjrwN8ofJwuC2r05F7AGd/BmO7qEyDjzxr/lqS7\n+ohb8sPLMyKaKBj4E40zSV/gP1hhH//KFvAKUOpTZl2A9598GN5/8mHZc5oG4paNkOHcASikmRn/\ncMjwJkiXmgvh9fFnAXdL0z9inF9LRBMFS32Ixhl/xn8wmdvVJ1CNvxls4mOQrj7pTOl2nvl0MF+q\npaju6tOsGn+t1Mq9Ya7c2/L2DSXxs79tBJDbV5+IaDxj4E80zuiMdDgkIxbwSlilS31SFazc6+/q\nAwDXP7oZ972wO/d86UzRkp2C53Tfu9QxXh//JmX8tY5w8cA/W+rDgHIsYMafiCYKBv5E44wO7mdM\nimIwkUbazngtMstm/CuY3BvJq/G/6fGtuOXpHTn7pDMK4YB3EPznLDXPoNmTe/UYSq1P4LXzZFef\nlpR/Acxe+kQ0UTDwJxpndKlPT5cT+OugHwg2uTdoQJ1f6hNL2tjbn8jZJ21nYFaR8S/ZCaiZgb87\nvlKLdwHZ7w0z/q3pjmdzF5TnvxIRTRQM/InGGZ3N7JkURcrOoG8w6b1Wqp2nUqqiUp9oXqnPUDKN\n3f3xnH1StipZr59P3x0oNYZsH//mLOAFlG7lCQAhQyDClXvHCr1aNBHReMfAn2ic0TX+PV3OgkQ7\nDznBeFebWabnvpP3jAQM1LMLeCmk7QyS6QwGEmnEUtk7DNVm/EtdLLSFm9jVx33PzhKtPL19DYN9\n/MeIG5Zvqdu5f3j/y3jL5X+r2/mJiCrBwJ9onEn4Sn0A4BU38O/pipYs9dHZ6UoX8ErZtrfoFgDs\n8ZX7ODX+FQT+XlefEhl/d1JttAl9/PVFUUek/N0GMyTs6kO4dskm7DoUL78jEVEDMPAnGmfyA/9d\nB93Af1K07Cq7QPBMur+rTyzpC/wHsoG/ZWcQLlGvny8cChD4N7mPP1C+xh9w5imk2cefiIhaCAN/\nonHGX+MPwMs2zuxuK9nOU9fqB+7q42X8Vc4EYn/G37IzFfXxjwbp498CgX+QjH84ZLDGH4CI3Cgi\nvSLyom/bNBF5SEQ2uH9PbeYYiYgmCgb+RONMPK/GPz/jX6x1oW7LWenKval0Jqeu35/xT9sq8IUE\nELDUx5vc2+IZ/5Cwq49jEYCz87ZdAmCxUupYAIvd50REVGcM/InGGX8ff8DJ+IcMwbTOMJRC0Qmn\n3uTeKkp9hpOFa/ytCroEAb52ngFW7m1OH39nXEEm95qGwT7+AJRSywAcyNt8LoCb3Mc3AfhgQwdF\nRDRBMfAnGmcSaRtR00B3exgAsHcgge42E23upNhiE3wrLvXxuvrkZfxzAn9Vsid/vopq/Jswudcr\n9SnTztPZlxn/EmYppfQyz3sAzGrmYIiIJgoG/kTjTCJloy0cwiS3HCWjgO72sNcNp9gE32xXn2CB\nesgQGOJm/N0+6IdPac8t9clkSq5wm6+SUp+mTu4N0s4zZCDNjH9Zyqk9K3iFJCIXishKEVnZ19fX\n4JEREY0/DPyJxpmElUFb2EDENLzseHdb2HtcLPDXNf6Vtt9M2RkMu5N7j+7p9DL+SilnJeAKJvdG\nAkzundoZAQBM6YgEPm+t6PEFa+dpIJVmxr+IvSIyBwDcv3sL7aSUuk4ptVAptbCnp6euA+JEbCKa\nCBj4EzXRbx7fih/e/3JNz5lI22h3s/tdbU65z+R2X+BfpLOP5V4QVNIfPxIy3Bp/J/A/pmcS+oaS\nsOyM18qyooy/V+Nf/JjTXzUDd3/pLThqRmfg89aKzvhPCjC5NxwSZvyLuxvAp9zHnwJwVxPHAgD4\nn3vXNnsIRER1x8CfqIkeebkXi9furek5426pDwB0tzkBane76ZXI6JV9840m4x9zS32O6emEUkDf\nYNKrb6+knWckQP2+YQhOOmJK4HPWkreAV9A+/qzxh4jcAuBxAMeLyE4RuQDA5QDeJSIbAJzlPm+q\nlVsPNnsIRER1V/7Ti4jqJpaya77IUyKd8er5J+nAvy3sdcMpNrm30pV7AV/GP5VGxDRwxNQOAMDu\n/oT33pVMwo2Eypf6NFO2xj9YqQ/LRwCl1PlFXjqzoQMpPI3A88KufgwmLO8uGRHReMSMP1ETJSwb\nmVoH/paNdjfI73KD75xSnyI1/kmrsj7+gJOht9wa/85ICLO62wA4nYS8jH8lXX3M8qU+zZRdwCto\nqQ8z/q2k3E/i6y59sCHjICJqltb8dCWaIOqS8beypT5dUSd72d0e9kp9igX+AwnL3Tf4jcCwm/GP\nJW10REzMmewE/nv6E162u5oa/2a06gxCX5h0BmjnaRoG0sz4jznr9gw2ewhERHXTmp+uRBNELGXD\nrkvGP7/Ux0RbuPTk3v64E/hPbg9e6uBl/FNpTIqamNIRRsQ0sGcgG/hXegcBqOwuQSPpGv8gK/eG\nQ1J0sTRqXU9vzV9rjIho/Cj7iSwiN4pIr4i86Nt2hYi8LCKrReROEZnibp8vInERed7984t6Dp5o\nrItb9cj4Z7IZf29yb/mMf3/cQsiQQB1rtIhpIJl2Jvd2REMQEcyZ3IY9/YnqJvfqGv8m9OgP4s3H\nzMA/vuEIzHXnMpRiGuzjPxb9+bldzR4CEVHdBPl0XQTg7LxtDwF4rVLqJADrAXzV99ompdQC989F\ntRkm0fgUT9W+xj9u2V52X09U7A5Q498ft9DdZkKkspV2U+kMhpJpb1GrWd1t1Zf66D7+LZrxnzut\nA1f848mBFg8Lmwa7+oxBK7exuw8RjV9lP72UUssAHMjb9qBSKu0+fQLAEXUYG9G4lsmoOmX8/TX+\nI7v6JIqW+qQrKvMBgKhb6uPU+DvvedjkNuw6FPfKXCoJ4oOs3DtWhA3xWqQSPbudFxRE1Hy1+HT9\nLID7fM+Pcst8lorI6TU4P9G4lHDbatajxt/r49+uu/qYgUp9Kg38IyF35V63xh8Ajp3VhV2H4jgw\nnAJQWRAfDrCA11hhhtjHn7LW7OrPeb7hsnOaNBIimshG1cdfRL4OIA3g9+6m3QDmKaX2i8gbAPxZ\nRE5USg0UOPZCABcCwLx580YzDKIxSS96VcvA384oWLZCmxvkv+uE2egbTOLoGZO87HOxPv79cQvd\nFQb+Xlcft8YfAE48rBsAsGrnIQDVLeDVqn38K2GGWOPfqjb/z3vw7PaDeMORU3HUV+9tyHv6/5e/\n53WzR1wQHz+rqyHjIKKJrerAX0Q+DeB9AM5USikAUEolASTdx8+IyCYAxwFYmX+8Uuo6ANcBwMKF\nC5kWowknXofAX5fxtEecoGJaZwRfeuexAICo6K4+Rdp5xi3Mndpe0fs5XX2U28ff+XVy4mGTAQCr\n3cC/0gXB9HnHurDBrj6tyjAEC+dPa+h7fuuuNd7jqz/2egDAh19/OCIhA4diFjbvG2roeIhoYqrq\n01VEzgbwFQAfUErFfNt7RCTkPj4awLEANtdioETjTdwN0muZFdbn1KU+fiKCqNuFp5CqSn1MA7FU\nGsl0xlvUqqcripldUaza4ZQ2VBT4m06m3zTGfuBvhtjHn0aaM7nNm0B/5UcX4PKPnIQK5tMTEY1K\nkHaetwB4HMDxIrJTRC4AcBWALgAP5bXtfBuA1SLyPIA/AbhIKcWmyEQF6FKfjALcm2ajpjP+utQn\nnxP4jyz1UUpVFfiHQwYOxpz+//5FrU48rBt7BhIAKm3nGXLPO/YjITMksLhyL+XZ3Z8ouL1GvwKI\niEoqW+qjlDq/wOYbiux7O4DbRzsooolAl/oATrlPJQFyMQm3jKctUiTwD4cKZvyH3YXEKq3xj5pO\njT+Qu6jVCYd145F1fQCAcAXZ+/HV1YcZfwqGGX8iapSx/+lKNEbFrbT3uFYtPbMZ/8L/taOmUbCd\nZzWr9gK5tfgdEX/Gf7L3uJILmvkzOvChUw7HqUc1tv66HsyQIKNq37WJxif+lBBRI4yqqw8RVS+W\nl/GvhUSJGn8ARWv8B6oM/P0lOXpyL5Dt7OPsEzy/EDVD+Mk/LahoDK1Kf92WnUHIKPzvQQQAAqb8\niagxmPEnapKcwL9mNf5OUN9erNTHDBXs6lN1xj+UfZ8OX43/3Kkd3uJh46Fevxr66671Am00PtVq\nng8RUSkM/ImaxF9yY9eo7WO83OTecOHJvbUo9Znkq/E3DMFr3Kz/eFiMqxq6MxHr/Mee3sEE3nL5\n37C5r7oWm/es3o2fL94Q/ICJeW1MRE0wMT+RiVqAP+Nf8xr/cOH/2m1m4cm91Qb+/mx+RyS3clCX\n+0z0jD97+Y89i1Zsxa5Dcdz02Naqjv/izc/ixw+tr+gY/pQQUSMw8CdqEn/gn6l1O89iNf7h0jX+\n1XT10fztPAHgnNfOwRvnT8WU9khF5xwv9J0Ort479uw4GAcAr99+vU3MS2MiagYG/kRNEk/VsatP\nqcm9Rbr6iMCryw8qt6tP7rGnHjUNt1305nGxCm81TMOt8WfGf8zR5VmLqsz4V4U/JkTUABPzE5mo\nBcTrUOPv9fEvUuoTNUNe332//riF7rYwDKOy3KO/Y09nkQnFE5W/qw+NLfe9uKcm51m141Cg/Rp1\nZ4GIiIE/UZPUp6tP+Yy/3ueu53fhtpU7AKCqVXuBbMY/ahoTdhJvMSa7+kx4B2MpnHTE5PI7ggl/\nImoM9vEnapLclXtrkxWOWzZMQ4r2zvfX+N+wfAsG4hb+ceHc6gN/9306KywRmgh0Vx9m/CcuBSDI\nNT3z/UTUKEzRETWAP8jX6tPVJ1M02w/kdvXZ05/AtgMxxFO2U+rTXnnwHnYz/h0s8xlBd/Xhyr2t\n7dvvP6F+J1fBJ+6zjz8RNQIDf6I6e3b7Qbzu0gew61A8Z7u/xr9WE0ATabtk4K/7+Ft2Bn1DSSgF\nbOwdqjrjH9UZ/wgz/vlCBtt5jgX1zLb/+fldCHLdJ8JSHyJqDAb+RHW2fX8M6YzC7vzAvx7tPFN2\n0Ym9gDO517IV9vQnvBKEdXsHMTDKGv/8Vp6UndzLjH9rm9pZv3azdz3/SqBMPkt9iKhRGPgT1dlQ\n0mnbGcsr94ml0t5qtzUr9UnbaC+V8XcD9e0HYt62dXsGMBBPV9zDH8gGt6zxHynktfNkjX8r+/sT\nZgMAvvaeV9fl/C/vGQy0Hyt9iKgRGPgT1dmwG/jH8/rnJ6yMF/jXKitcrsZfB/7b9juBf1vYwKqd\n/UjZmVFl/FnjP1KYXX3GhPZICFsvfy8ufNsxTRsD23kSUaMw8Ceqs2E3058/wTeWSqOrrbaBf7xc\nqY97UbBt/zAA4E1HT8fzbq/xUZX6sMZ/hJDBlXspOMUqfyJqAAb+RHU2XLTUx8akGgb+CcvGrkNx\ntJcIwnXGf+v+YURMA6ceNc1b0Gs07Tw7WOM/AlfupaCY7yeiRmHgT1RnsdTIUh87o5BMZ9DV5gTb\noy0HyWQULr51FXYcjOGfT5tXdL82L+Mfw5zJbXj17C7vtdFN7mXGP5/Jdp4tpdVr6Js1viXrevGu\nK5dyvQmiCYKBP1GdDSV1qU/a26ZXz+1yA+bMKIPDHz+0Dve8sBtfPefV+PsTZxfdz1/jP6u7DcfN\nGmXgz3aeRemMv8XAv2W0bCl9E8f1tTtewIbeIfQOJps3CCJqGAb+RHUWK1Dqox/XoqtPJqPwy6Wb\n8b6T5uBfTz+65L5R08n4xy0bcya34fAp7eh0J+ZWE/h3Rk3M7m7DsTMnVT7wcU6v3FurVZlpfGtW\nxl9PLB5t8oGIxgYG/kR1Vqidp57om53cW31waGUySGcUXjOnu2x3kKhv4u/s7jaICI5zy32qLfV5\n4mtn4pzXzan42PGOC3iR3+2ffzMA4F0nzBrxmjQx5a8XFvzPW59v2hiIqHF4f56oznTAn/DV+Mcs\n52KgFjX+enKuLrspRZf6AMDsyW0AgONndeG57Ye8sVBtcAGvsefsE2fj/jV76nLuNxw5FVsvf29d\nzl0LT2892OwhEFEDMPAnqrNCXX10xr8WXX10RjliBgn8s913Znc7gf+n3jwfx83q8jLUVBtcwGvs\nqdUK2pVq1twD/mwSTTxlIwURuVFEekXkRd+2aSLykIhscP+e6nvtqyKyUUTWici76zVworGiZKlP\nDRbw0hn/cJUZ/9fM6cZn33pU1e9PhXntPJnxHzOa+S+lmnDR8f171jb8PYmouYLU+C8CcHbetksA\nLFZKHQtgsfscInICgPMAnOgec42IsME3TWgFS33yavxHExzqNnxBMv7+VX114E/1wXaeY08zgm+g\neU19Fj22Ned5Im91cSIaf8pGCkqpZQAO5G0+F8BN7uObAHzQt/0PSqmkUmoLgI0ATq3RWInGHKUU\nhlM6459t56l7+utSn9F01Eh6Gf/y4YPO+BsC9EyKVv2eVJ7u6sPJvWPH6w6f0rT3boWfko9c+1iz\nh0BEdVZtV59ZSqnd7uM9AHSbgsMB7PDtt9PdRjQhxS3ba9NXsMa/Bu08dcY/GqTG3+3q09MVhRmg\nNIiql834s456rPj8GcfgjfOn4rhZjW1PK+K089zYO9jQ98235pWBpr4/EdXfqD/5lXNvtOKoRUQu\nFJGVIrKyr69vtMMgakm6vh/IXblXZ/91J51G1fjrzj+zJ7dX/X4UjMl2nmNOxDRw20VvxoP/8faG\nv/eegQTOunIZrnjg5Ya/NxFNHNUG/ntFZA4AuH/3utt3AZjr2+8Id9sISqnrlFILlVILe3p6qhwG\nUWuLuav2Rk3Dy/IDQMy9COiuSVef4DX+ZsiAaQhmd7PMp95EBCFDWOM/Rn3stHmYMSmChGV7F9dB\nvfvEkb36S/H38b/6kU3Y05+o6Phq/HLpprq/BxG1nmoD/7sBfMp9/CkAd/m2nyciURE5CsCxAJ4a\n3RCJxi6d8Z8xKZoT+CdSNkSAdnfV3EZl/AFnoa550zqqfj8KLmQILJb6jEmGW37z6m/ej3f+eElF\nx+r5HdV60w8Wj+r4cvoGk/jBfbyzQDQRle3jLyK3ADgDwAwR2Qng2wAuB3CriFwAYBuAjwKAUmqN\niNwK4CUAaQBfVEqxTQBNWLquf0ZXFHsGElBKQUQQS9loD4e8YH1UC3hVkPEHgN9ecBrmsKNPQ4QN\ngc1Sn6JEZCuAQQA2gLRSamFzR5QlEK+v/86D8fq+VwPb+iQsGzsOxhr3hkTUUsoG/kqp84u8dGaR\n/S8DcNloBkU0XujFu3omRWBnFFJ2BlEzhJhloyMSgiGjnwDqLeAVMON/wmHdVb8XVSZkCPv4l/cO\npdS+Zg8in0hrdNqptW/ftQZ/XLmj/I5ENC6xrQdRHelSn54up6Y+kXIC/HjKRnsk5E0AHc0CmrrU\nJ2jGnxrHDBlIs9RnTBIAh2JWTc51yTmvLvn6oxsad92zbAObaRBNZIwUiOpId++Z4fbMj1nO83jK\nRkfYhGEIREab8a+sxp8ax+Tk3nIUgIdF5BkRubDZg/Hbdaiy8p7VOw/hz88V7GWBC08/uqbvNRrN\nWiyMiFoDIwWiOhpyu/p4gb9b8x+zbLS5E3vNUZaDMOPfukxD2M6ztLcqpRYAOAfAF0Xkbf4Xm9n2\n+eG1vTnP/7LqlZL7f+CqFfj3Pz4PAFB5RUKGUXm4Xa9VdPnTSDSxMVIgqqNYMjfjrzv7xFNpdISd\nwN8Qga1GP7k3yMq91FhmyGDGvwSl1C73714AdyJvpfdWavv85Vuea+j71SvwJ6KJjYE/UR0NpdKI\nmAa625159HoRr1jKmdwLuOUgo8gKexl/lvq0HCfjzxr/QkSkU0S69GMAfw/gxeaOavzb3YA1Aoio\ndZXt6kNE1YslbXRGQl6Qr0t94r5Sn9F2fqlkAS9qLDPEGv8SZgG4U5zOViaAm5VS9zd3SKP3g3vX\nwrIVIqaBtx/Xg3MXHFbVeUZxE5CIqCgG/kR1NJxMozNqos0t64m7k31jSdsr9QkZ2X7h1ah0AS9q\nnJBhsMa/CKXUZgAnN3sco7V3IIF1ewa9579cttl7/KtPVr8sAX9qiKgeGPgT1dFwKo3OiImOSLbU\nRymFA7EUpk2KAHCCw9Fm/EXgtQal1hEOyag6NlHrO/eqFdgzUPvyGcWUPxHVAVOERHU0nLTRGc0t\n9RlKppFKZzC90wn8R1vjn7QzCIcMSCOX/6RAuIDX+FePoB9gxp+I6oOBP1EdDbmlPu0RXepjY/9Q\nCgAwvdPp9DPqGv+0QpRlPi3JNARplvpQFdb7yoeIiGqF0QJRHcXcUp/2cDbjv384CQCY7pX6jLLG\n37YR5sTelmQabOdJ1fnY9U82ewhENA4xWiCqI6fUx0Q4ZCAcEsQtG/vcjL/u7R90Aa9fr9iCfyvQ\nS9xKK7bybFFmSGCxxp/K6Ipyuh0RNQajBaI6Gk6l0Rl1sv3t4VBuqY+b8TeMYBNAn9t+CE9u2T9i\nu2VnEDZZ39+KTIPtPMeqX3/mjSO2Lfz+wxh2F+WrpdOOnl7zc/rtOBDD01sP1PU9/Cw7g8GE1bD3\nI6LgGPgT1ZFu5wkAHRETsVQaB9xSn2n+yb0BgsNk2vZad+ZstzPM+LcotvMcu95x/Ex85ezjc7bt\nG0pi/d5s7f2Lu/pr8l6HTWkruP3iW1cVvMtXqdN/9Aj+8RePj/o8QX3+d8/gdZc+2LD3I6LgGC0Q\n1UkqnYFlK3S6E3vbIyHErQz2DaXQ1WYiamb7+AcJ/FPpTMHA30pn2MO/RbGd59j2hTNeNWKb/3/q\n+36+vCbv81/vPr7g9tuf3Ym7V71Sk/cAUPT3zJzJhS88qvXw2t6ano+IaofRAlGd6JIAnfF3Sn3S\n2MIvS+4AACAASURBVD+c8ur7geBdfZLpDFL2yCAyZWcQ5eTelhRiV5+WUe38+XNeO7u2Aymgqy2M\n5f/9Dqz8xll1fZ9YqnCZ0s/OPyXn+bb9w1W/R4albUQtjdECURW27BvG5367EgnLLrrPsPsh2xnR\npT4hp6vPUNLr4Q9UlvG3bDViYR/LZsa/VQWduE2NIah8LsxhU9pznh+KpfC9v76EPf217d9/xNSO\nnIRAPRT7SWxz7z4CwPxL7sHbr1iC5Rv2AQDuf3E3rn90c5EjR3p0477RDLGkVDqD21buqGpxs3iq\n+O/qWtvTn0DvYH3WdyAaLUYLRFVYufUAHlizFzsPxovuM5x0Pmi8jL8X+Ke8ib1AJTX+TrY/P+uf\nYqlPyzJDbOc51n3l7ONzVsX+7KKVuGH5FrzpB4ubOKrqbO4rnMkvtPafnstw0e+exffvWRv4PepZ\n2vazxRvwX39ajXtf2FPRcSu3HsBrvnU/lq7vK/h6f9yCVeBuarXe9IPFOPWyYD8fQ3WYLE5UCqMF\noiroCZuFau61Ia/UJ9vVJ2E5ffynV1Hqo98r/z1TtkKEpT4tyTSkpgEFNV7UDOE9r5vT7GHUxAev\nXlFwu15ZvNXtG3IaIwxU2DHoKbej0WObcu9GXHr3Gsy/5B6c/J0H8bnfPlObQVbgkXW9eO23H8CT\nm0d2axtLlFJIN/j3nFJqVCVpExmjBaIqpNJONj+ZLn77WNfTZrv6hDCUTOPAcAoz8kp9gtTF6vca\nEfgz49+yzBDbeY4HhTLi48nRPZNGbDsUr107zgsWPV22O9EfntqOi29dVbP3LCS/1GvRY1u9x397\nufETkp9wA/5nth9s+HvX0rVLN+FVX78P/bHR/cz0DSYx/5J7cM/q3WX3vf3ZXXj7FUtGXMzl7PPM\nTmzuGxrVmMYjRgtEVQiS8fcm90Z0qY+JvQMJZBTyMv5GZRn/vMyKxcm9Lcs0DGb8x4GJcO32rhNm\n5TxfsXFfzS5aF7/cm9OdKGHZI+ZHXXLHC7j92Z1Yur6vaCKkkrKYfUNJby7AKBZGH5WdB2MlX9cX\nIj+6f523LWHZuPy+lxs6J2G0blu5EwCwz21VXS1dXvb7J7eV3XfVjkMAgI29xQP7i29bhbP/79FR\njWk8YrRAVAUdfBfqsqNla/yzpT76gqGaGn/vPQtm/Md5SnKM4gJe48NfathSs1Xl/155ZttB/GLp\nporPc8ezu8ru8+pv3o+TvlO4z/+nbnwK1z26GWte6cdx37gvZxL1X91McH+ZuxEv7urHwu8/jAtu\nWonfPpENIhtx56Z3IDveYnMK7nxuJ97/8+UFv783PbYVv1i6Cb9cVvn3vln0BVatvr21vFArlZyb\nqBj4E1XBKhKE+w0XKPXRpndmM/6GBGznaRV+T8vOsMa/RYVCAouBPzWIUsrLmq7dPYBP3PBkyXJE\nv0JBaqlsajH+kpmv3flCTtnGM9uyqweX+t25dvcAvnzLc0ilM7jzuZEXEvp3YTHr9gx6Y/nmn18M\nPPbR2HEghkOxFE79n9KTeuMpG//xx1V4ocjib/r7Uss7hUop/PTh9dhxIPcOxEDCqqpDUjES4Mrq\nO39x5lUUPL5mI6nMCzv7A30fVmzcl3NhV60LFj2N7//1pVGfp1pVRwsicryIPO/7MyAi/y4il4rI\nLt/299RywEStIFDgrzP+kWxXH21GXsY/UI1/kbsMbOfZusIGu/pQ4/zq0c34+58sw6V3r8Eld7yA\nRzfsw61uGUY1/MGQnVElg9EVG/dh677hnGztzU9uxxdvftZ7/pFrg60ebNkZrwPR8zsqr39vxv+4\n03/0CM788dKy+130u2CTiP3zEdJ2BptGUau+/UAMP314A/7lppXett6BBE669EFcs2T0dxb09ztI\n4P7rFVtH/X61dO8Lu/H+q5bjz8+Xv1P18eufxAeuGjlBfseBGM69eoU3+bycxS/34vrlWyoea61U\nHS0opdYppRYopRYAeAOAGIA73Zd/ol9TSt1bi4EStRId8CdLBP4DCQshQ9AWdv6btYd9GX9/jX9I\nkC7TAk8pVbSrTzLNjH+r0ms01DKrRlTMsvXORMdFj231aqBHk/H2/9Se8t0HcezX7yu678evfxJn\n/O8SxEusbQLkrh5crBNMuXadqkxoX+//b9v2D+PgcGrE9v152wqtG1Gs/Edbu2cAADDo61x0xQPr\ncOaPl2L7/tJzBorR33L/3Z9X3BKqB9ZU1hq1EP3trqSUKpXO4H8fWIdLbl+NwYSFtJ3BjStKB8Pn\nXrUcl969pupxpu0MvvHnF3LufGxy72rpu1uxVBqX3r2m6ByLPQUy/r9YugmrdhzCwu8/PCYSPbWK\nFs4EsEkpVX5GBtE4EGRy7+a+IRw5vcO7/alLfQwBprSHvf1CUr4O3J/lL1jqw4x/S9L937mIF9XK\nzoOxogsHhozKiyVKJQ3uej47t2Eg4ZQu5gdEB4dTXmlNEFc/stF7/Kqv34f7X9yNVw4VXw8lo4CH\nXtqbE8xXG9fbGVV2Ya0Xd/XjwTLB8NuvWIIzryyf3a9UKp3xLnpuejwbTul2pH1DhcfeH7fw5wIl\nUVqpC6F1ewZzSrAqVW0rz0/e+CSuemQj/vD0DlyzZBNufmo7Hl7rlInpC7uXXhnATb7OS6t29ud0\nYio3rnzP7TiE3z2xHf956/PZ/dy/9UXadcs2Y9FjW8tehBRTLonXCmoVLZwH4Bbf8y+LyGoRuVFE\nptboPYhahg7EkyV+4a3fO4TjZ3V5z3Wpz7TOKAzfB7RpCOwyn2T+OwuFFvBixr81me4F2VjIAlFr\nOrqn03tsZxTe+sNHclpj/mrZZnz4mhWYf8k9ZbPJhfzt4rdXtP/brngk5/m5V6/Au3+6LPDxD6/d\nm/P8ot89izdf/rei+z/00l78629W5kwaLve/Kf91HQRet2wzTr1sccmOOe/7+XJcWKSn/4qN+7Bl\nn1OCdKBAxj/fLU9tx/PunZdyHlnXi8V53xtNf1oU+5j4r9tW4d//+PyIC7D5l9wz4o7Pwy/txau+\ndi+G3Au5ZDqTU4I1mLByJk8nLBt/fHp70YuHH96/zrt7UMnK2E9szl5sZJTCYGJkx6b3/OxRfLtI\nhr/cXZ/7Xix+8VboS9F3K9JuUq+S39n+Ox2lPsqXb9jXEis6jzpaEJEIgA8AuM3ddC2AowEsALAb\nwI+LHHehiKwUkZV9fZX/siJqJqtI2Y2WsGxs3T+M43yBf4db6++v7wfcchC7TMY/XTjjb2cUMgqs\n8W9ROuPPlp4Tx+Uffh0eu+SdeOKrZ9bkfP5AIuM+WeybQHvZvWvx7PZgwWW+U+ZNwRFTOyo6pm8w\nt455+4HKyk9W7yw8qbWcvb6A6WeLNwBwyikL3v0oE7M9+FLl5S37h5L4+PVP4h3/u2TEa/mTZrUX\ndvUXXTQt32d+/TQ+//tnC76m7xorOJ8tq3fm/nvr8pNCZVb+rkYA8C+/WYl0RuHFV3L/HX5w31o8\nuqEPC777EE7+zoPY2OtcRPzkofX479tfwANrCl+U/N53/l8/tgX3vVC+B38h/guLJzYfwHf+Eqyk\np9ilxhd838sf3f9yzvlXbnPmjby4q9/7P5XP/728/ZmdeLYGay388w1P4iPXPjbq84xWLaKFcwA8\nq5TaCwBKqb1KKVsplQHwKwCnFjpIKXWdUmqhUmphT09PDYZB1DjlJvdu7B2CUsDxs30Zf7fGf3qB\nwL9cKUiySOCvHzPj35pMt80qM/4Tx3mnzsNhU9oxe3JbVcd/+/0nAAAu+9Br8e4TZ+UELLXuelLt\nj+X8S+7BKd8t3I6zXgrFZydd+mDBuw352eD8Y//fH57HR38ZbKIxAOzpT+C9P1te9PV3/aT2ZT9+\n/oz/JbevxgeuWoG9vlrzoD8X/q47+b+Tfrl0Mz5xw1Pe9rOuXIYl63q9zPlggNWSf71ia9GLF2f8\nwX/ggk4CDnLGa5Zs8krVtCc278f7fr4cP33YuYjUdxz0z861SzbhEzc8icc27sPFt63Ch6+pTcC+\n40DxsrZGqUW0cD58ZT4i4l/b/EMAGtNLi6iBvFKfIq3ydEu94wqU+vhbeQLuyr1lfiGmipT66MfM\n+LembMafgT8F8+k3z8eTXzsTHz/tSHRETGzdH8PvntiGy+972fs5qsXk1fe+bg7+9x9Oqvr4gzEL\nf1/ngLcUPSl1mzvh9aVXBnDM1+7F2t0D+O/bXyh7/FNbSte1++vWz7pyacFJnVqiTHtRwPkdXuzO\nQDG6S4y/lETfMSm0mNmWfaU7/+gyJQCB1mjY2Dvk3dHRP3JKKdz3wm5YdgbxlF10Mvcz2w56q/Dq\nr2PJuuLVHaV+pL/w+2fwgauyF15XPrQeBytdJVjlXiCdd90TOS8vemwrXtzVnzOORzfsw8euf7Ls\nqSspcWoF5mgOFpFOAO8C8Dnf5h+JyAI4F2Jb814jGhdS6dKTe9ftHUQkZGD+9OxtdD25Nz/jbwbK\n+Gd/uTLjP3awxp8qJSKY1e3cLdA97L/h1mnPce8iZJSTdb/5X0+r+n2u/vjrRzlSZx5To1zxwLqc\n55/Lq8O//tHNsDMK5xRYqTVom0V/MP3jh9bjna+eiZld0YpWDC5k31ASP7r/5Ypbqy78/sPYevl7\nvedK5d7L6I9bWLIuW/b1H39chTcdPR1zJreXPXehmvp8/jvN1y/fjI++cS6WrO/D53//LN5xfA8e\nKRHIL9/gdJjS7Vy3Xv5efGbR00X3L/UbMr/Lky71qkTMKv/1Bi3niaXSOO2yxfjZ+afgHa+emXNh\ndveqV7B47V787PxTEDWznfxaqbPbqAJ/pdQwgOl52z4xqhERjQHlSn3W7xnEMTMneYEfkA38Z0zK\nz/gbldX4+zJRehwRrtzbkkKs8aca+sPTO3Ke//bxbUX2nHjuKNHV5qaA36fXfvsB7/Ez2w7i2jI9\n7t/6w7/hgwsOL3vehd9/OND7F7PBbTWZ/ynx/922Cg+9tBdRX+LnwHAqUOAfhP9iS1/k6TampYL+\n1TsPeQtYBlVtXKw/+QYSFk669EF879wT8ZE3HDFiv+/99SV89i1HlTzXt+4KNq/g079+GoPJND6z\n6OmcCzMA+MqfVgNw/m/+y+lHe9vL5X72DyUxpSNSVWeuSjFNSFQFq8hiWprT0WdSzrbpk6KYFDVz\nOv0AQMgo3+6xXI0/S31aU5g1/lRDa3cP5Dwv1bmERuf/b+/Mw+Qqq/z/eWvvvTu9Jd0JCSQkIQGS\nQCBssgcDCIijjii4DA4y4oo/HNBxmXFUhhl1xsFRwR0dUYRxYVEBERBkSYCELQnZ0+mk091J7137\n+/vjLnWruqq6qrs6VdV9Ps/TT1fdunXvud1dfb/33O85Jxf51XF4lNsd7UmngmAkRp9pa9E6YdfZ\nsPswD79mFNw6zw97D42yvz/ZR/6kmX2fLKFoLKc2l5ff/hR3PLEjadkVt2eukVCocbv0ZMJ61+4e\nw5L0ud+8yrLP/2HMeg++fCCvOQPZGM8mBgltYLU7zZbx7x+JcPK/PsKtD71emADHQdSCIEyAbBn/\nwWCEfX2jLJ6dLPCr/R5e+NxaLjiuJWm52+Uat51npq4+dsZfrD4lidtl/F7KobezkJlrz8qeKZwO\nfP4ty4odwoRxetcLxbM5iLsjwS33JeoV/uvRrfZjK7OcyvU/3cDpX/1TUvFvppaY+bLkn37PK/sG\nxl8xDRuzdHMKRWNZ/f/ZGApFue+FjglfOBSCdNcTt/9pG8fc8gBvuu0xFn32oYzWqq//cQt/3mrY\ntTJ1Tio0ohYEYQJkm9xr3RJNzeyDIdBVStrB48phgFcG4R+SjH9JIwO8pgf/dOlxxQ5hyvm7Mr64\nSddic7rwgKM9prP3/XjcmZJxL2V++NSunOcdpHLb77dw4y835tQm1jmvYKoZCceIa+OuEMDBwbF1\nJi939PPNP23j43e/NOa1qUTUgiBMgHCWyb3pOvpkw2UK/2y3ApOKe9N5/CXjX5LYwl+6+pQ1qRfr\nqVitegWh0GSbDp+N7/1lYpNny5V/+nVxGkhuOzg07v8HSF/ndVkW+9NUMqniXkGYqURimTP+Ww4M\nUuVz016fW4GVJQ7jGjLV6Gby+Fvt/XyS8S9JrD7+kvGf3tz34TPY2jVY9hd4VqHigpsfKHIkglAe\nXPeT9Zy9ePxZVD97tnQK8UX4C8IEyFbcu717iIUt1bhyrM5323aQOG5X+sxhKFMff2nnWdJ4XFY7\nT/H4lztrl7XaxZSp+Dwursihu4sgCNOLHT3D7MihxuTnz+0dd518p2BPFFELgjABLMEdTjPAazAY\npa7Cm/O2LOGfzec/XnGvePxLExngNX24872rx7TuszimqeoIRzM53nf6/GKHIAhCGqaiUD0VUQvC\njOfZHb384vk9eb0nm9VnJByl2p/7zTRPDsLf2k+lz522uFesPqWJDPCaGeTi8S0lxivkbanxZ31d\nEISpYVevCH9BmHJ+/NddfOXBzXm9J5HxHyv8h0MxKn25C/98Mv41AU+G4t7yEh4zBRngJZQaL3xu\nLfMbs9+hOBJDhARBGEswPNZFUGhE+Asznp7BMP2jEUbymDQYydLVZzgcpcqfe5cPdw4tH62uPtV+\nT1rbj88tXUVKkVzu5gjlxfXnLCx2CJNiVpVv3HXmNhRm8qsgCPlxJE4VUtwrzHh6hoz+up19QRa1\nVI+ztkG24t6RKcr4e1yKgNed3uMvGf+SRLr6TD+q87ioLyVWz2/gHavn5rRuPv+/BEEoHOMN8ywE\nkvEXZjzdpvBPHXOeiXhc20IuFEkW/uFonHAsTpUvd3GQLiscj2s+/auNbOowhpqEonH8Hhc+jyu5\nq09MPP6ljNXVp9zbPArlz4//7lT+9pSjclrXKlmw/jctnZ3bTBInZyxsRBxDgpAf2eb5FApRC8KM\nJhiJ2aO0O/tyE/7phLfFqOnPq8qjuNftGlsAOhiM8sv1HTxujjEPR+P4PC58bldaq49X2nmWJImM\nv3j8pwtHspD3X65YnvO6373m5LTLrSREPA9BcfoxjQDc/7Gz+M+/XcmDH3sTj9x4ds7vB/jONSez\n46vpuyAJgpCeI6D7RfgLMxvL5gOG1ScXImn66FsMmXUC+Xn8je9OO0jQ9PQPmxcSoWgMv8ctGf8y\nQyb3lg6awvwOUjvenDy/oSDbTcd7T1/Arlsv5XcfOYsdX7kk67rnLmlm7bJW/vuqVdz/0bOor/Ry\n29+ciMu8UMnn6K87+xie/PR5LJ1dy1tXteNyKRa15J71P3NRI7UBo6Xx+89YkMeeDV743Fq+9o4V\neb9PEMqdI2ELFbUgzGh6hsL241ytPlZhb2prTYCRUNR8bXIZf8tCNGxuL1PGPxI13iN9/EsTaedZ\nWhQiWe9JGa997z+cMfmNjsMJc+vSDgT82AXHAnDHNSfj97i5872ruWxFG8e31/HS5y/inafMA/Nt\nOo+bTkop5s2qHLP8b07KXiNw1qImAGZVJS6Ovnj5cv7nPSelXf+KlW1ctKyVBY2VSUXTs6p8vO2k\n9rzaIgvCdOBIdICTT5Uwo+kZNDL+Prcr74x/ld9D92AIrbV9+3/YtvpMzuNvdfGxhX/M4fFPKe51\nu5S03ytR7AFeYvWZlnzhsmVHdH+7br2UbQcH+a9Ht/Evly+nocrHjWsXZ33PD99/Cj/5625qApM/\n3S9vq+XeF8Yuf/PyVv7jHSuo9nv42bN7uHxlW9Lrl5wwh123XsqCmx+wl335yuN5z5rkQWJXrmq3\n/78qpbj7utN4y3//ZdJxlyrHzamlucbPYDDCi3v6jsg+n/z0edz0q408s+PQEdmfkB+NOXTdmiwi\n/IUZjWX1Oa6tls4cM/52T31T+IeicQJeQ+hPJONv3Yp3+sCDZsZ/yNxeKGJm/NNYfcTmU7pIO8/p\nxzmLW2iu8fOjD5zC8ra6I77/RS01/PdVq3Jef/WCWaxeMKsg+z7F3M6XrljO537zKmDYcpwtQq8+\nLfNU4CduOo+hUBSPW3Fsmg5qS1KKiC27UI3fw03rlvB5c5+F4qY3L+Hf/7CloNsE40LoD692ZV3n\n3WuO4oNnHc0xzcbPwXlRNJX4vS7uvu50Og6P8KsNHWztGuSSE+bwlhPbjlgMQmasv4epRIS/MKOx\nhP+J7XXcs2FvUvY+E2FHxt96bgl/K+M/kcm9zqSwnfEPJzL+mYp7vW7J9pcqVlefiHj8x6CUWgf8\nF+AGvqe1vrXIIeXErCofz3/2wmKHURROmFvHti9fjMftYmfPCG31gZzmAlgc1TjWPjTe+v/34TNY\n1laL3+OmscrP8e21zG+sYiQc5cKvPc4n1i7mjid2sO3gUMbtnLKggV29I3QPhvjCZcv459+9BsAN\n5y3ihvMW8dUHX+e7T+zIKaY5dQGWzq7hsS3dPPnp85jbUMGizz5kX9xv/8oluF2KD/54PY+83sUX\nL1vGF839vW1VO/e9uI+T5zfwlStPyOtnMVluOG8hS2bX0lITAGBuQyWfuDD73aJyZlFLdda/iTvf\nu5q1y1q5Z/1ebvrVpiMYWXaORJJIhL8wo+kZClMT8LCgqYpgJE7fSISGcU5k1q1oS9w7hfiwnfHP\no7g3TeeXUNTK+JvFvZH0Vh/jgqA8+4rPBKzfbUysPkkopdzAt4C1QAfwvFLqt1rr14obmTAeVt3K\n54+QzWnVUYni6UtPnGM/rvR5ePqWCwB45+p5AFx1xzP8dUfvmG18+NxFnLe0xX6+sLna7uYGcPPF\nS7nypHbm1Fbg97pY+rnf26+9/i/reP8Pn+Mdq+fx/+7ZyIMfe9OYc8T2r1xiZ8st2+Vtbz+Rnz+3\nh/edsYBKnwe/18UVK9u5/tyFzE9zAbTrVqMDUjASIxbX/PCpnby8r3/cOwe5ctObl+a8rvNiZTwe\n+vibqK/0cvpX/0RdhZc/fvJs1nzlUQA2f2kdr3YO8Dffftpe/5aLl/LVhzZzxsJGbrn4OC67fWqs\nXKvm1bPt4BDXn7OQ7zy+fczrx7fXAvCO1fP47cZOnnyjB4CXv3gRJ3zxj1MSUzauPetovv+XndRX\neqd8XyL8hbLj7uf2cMcTO/jT/zt30tvqHgzRXO2nrc7IgnT2j44v/M2C2qp0wt/u6pNHca8a3+Mf\nisWp83nHevyjcXyS8S9ZPDlMZZ6hnAps01rvAFBK3Q1cAYjwFybMz687DYBoLI7H7bIz+amDGc9e\n3Jz0XCnF0tm19vMdX7mEB17eT0uNnwqfm1986HQA3n5y5uLmX99wpv15B+PO0A3nLQIwiqxNFrdm\n745k3T3+yPnH2suCkRgdh0dpqfXz9LZe6iu9rDl6Fu//4fOMhmOcuaiJq9bMo6UmQCyuuXdDB398\n7QAfOPNoeofDnJqj1etPnzqHXb3DnL+0ldl1Aa7/6Qt85LxF3P7YtqT1/v3tJ3LKglksaKqyl1kX\nLgDPf/ZCGqt8uFyKk46qp60uQGd/kEtPmMOHzlnIhxyF3LtuvZRILM6V//MURzdVc+vbTmD5F/6Q\ntL8PnX0M331iBx+/4FhOPXoWZy5qIhiJJV2gfe0dK/jUPRu5bEUb15w2nxPn1nHFynbOOraJy1bM\n4e7n9nLj2sV85/HtnLJgFnPqEtOp77p2DQf6g9QEPFT5Pfz7209k5bx61n7jiaQ4nvvMBZz6lUfH\nnIfzRSnjwuSFPX1ctKyVL1y+nNYaP+8/YwGttYEJbzdXRPgLZce2g0Ps6BkmEotPuptN91CIpmo/\nc+qNfwKdfcFxfbthO+Nv/IN2/gMYMTP0+WT804nDYEpXn1Akhr/Gn97jLz38SxZp55mRdmCv43kH\nsCZ1JaXUdcB1AEcdldvwKUGw7krccslx3PTmJfbzXHG5FJetaBt/RQcr59XntX4+BLxu++Jl3fGz\n7eU//rtTx6zrdineecq8pIuNXDmmudr2mK87fo4t5q85fT5KYduExqPZ0fJWKcXTt1xAZ9/omFa4\nFl63i/s/+ib7ufMiwuKWS45Leh7wutl166UMBCP0DUc4qrGSv0m5MDvrWKPL1PK2Or701rq027GY\nXZc4tneYd5B+cd1pLGiqShLjj9x4Ns01AeoqvERicQ4Nh/n7n6xnU0c/N1+8lL9u7+WmNy9hyewa\nvG4Xb3QN0ljt566/7uaC41o4OBjk/KWtAGw+MMCS1hrbXpyuk9ZUIMJfKDusHvfBSGzSwr9nKMTS\n2TV2xj+Xlp6W0K82u2SE0mT882vnaXn8x2b8h0LJHn+/2xD+Vi1CIS5+hKnDLRn/SaG1vgO4A2D1\n6tXyQxTyJl/RL4ylEFnotvqK8VeaALUBr10EXmjWmIPsnDjnWXjdLlprA/z2I2fZy5xtaQGONe/w\nfPxC6w5OIrHovMt0JJFPhFB2jIYNoT0aiU16Wz2DRsa/qdqP161yaukZSS3udWb8wzEqvO682mum\nE4fOPv5aa9vj73W70DqxrtXfXyhNlFJ4XIroEejNXGbsA5wpybnmMkEQBGEKEcUglB3BSKLgdTKE\nojEGglGaqv24XIrZdQE6+8bP+FvCv8bu6pO4ABkKRfPq4Q8J4R9LsvoY24xrw/bj7OMPiYuNcExL\nxr/E8biVtPMcy/PAsUqpo5VSPuBdwG+LHJMgCMK0Z1JWH6XULmAQiAFRrfVqpdQs4BfAAmAX8E6t\n9eHJhSkICSxRPNmMf685tbep2vAdzqmryMnqk5rxDyV5/KN52Xwg0fIxubg32T4UisTwe9xJwr/K\nD+FoTDL+JY7H5ZJ2niloraNKqY8Af8Bo5/kDrXVhm7QLgiAIYyiEYjhPa71Sa73afH4z8KjW+ljg\nUfO5IBQMS/CPhicn/K0e/lYhUnt9RU5Wn3AsW1efWF6FvZDB6pPSItTu428Jf/PiIxLTMsCrxDEy\n/mL1SUVr/aDWerHWeqHW+svFjkcQBGEmMBWK4Qrgx+bjHwNvnYJ9CDOYQmX8uwcN4d9UbbTvBZHW\nlgAAIABJREFUnFMX4MBAcFxbhl3cmy7jH47mNbwLslt9wLAPhaLGhF5L5NtWH/H4lzwelyIiVh9B\nEAShBJisYtDAI0qpDWbbNYBWrfV+8/EBoDXdG5VS1yml1iul1nd3d08yDGEmMWp6+4OTFP5Wxj9h\n9TF6IPeayzORfYBXjMqJCn+dPuPfPxpBa5I9/nbGXyb3ljpulyImVh9BEAShBJis8D9La70SuBi4\nQSl1tvNFrbXGuDgYg9b6Dq31aq316ubm5nSrCEJaQpFEO8/J0GN6/C2rT32lkfnvH41kfZ8t/APp\nJ/dW5Wn18bjGTne12nkCHBo24vR5XPjHFPdKO89Sx+NySTtPQRAEoSSYlGLQWu8zvx8E/g9jGmOX\nUmoOgPn94GSDFAQnowW0+lT7PfakxLoKoxdw3zjCP9Xq4xyoNRKO5V3c604z5MnZseiwKfzTdvUR\nq0/J43ErouLxFwRBEEqACSsGpVSVUqrGegxcBLyC0ZLtfeZq7wN+M9kgBcFJorh3cmKqZyhk+/sB\n6itN4T8yXsY/W3Fvgdp5RuN2dr/Xzvi77ey+0+ojxb2ljcelJOMvCIIglASTaefZCvyfOWrYA/yv\n1vr3SqnngV8qpa4FdgPvnHyYgpCgUMW9hvBPjBC3Mv7jWX3sjL/PKu5NxDESitkXBLniSefxj8Ro\nqvazr280OeMvxb1lh8flkgFegiAIQkkwYeGvtd4BrEizvBe4YDJBCUImtNYEJ1ncOxqO8e3Ht/PC\n7j7ecuIce3l9hZH97xsJZ31/JBbHpaDC9PI7RXg4Fs/b4+9Kk/EPReM0VHnZ1zfqyPiPtfpEZIBX\nySMDvARBEIRSQRSDUFY4u93kIvyf2NrNu+98xhZe0Vicy2//C9989A3WHT+bmy9Zaq9bE/CgFAzk\nUNzr87jsbjqWCB8JRwEmMMBrrMc/GDFqBQJeF4dHxnr8Q5LxLxs8LiUDvARBEISSYFKTewXhSOMc\n2pXLAK+nt/fy9PZeDg4GmVNXwYGBIG8cHOIzlyzlurMXJq3rcilqA97xi3vNTjpKKXweFyHTxjFs\nxjNRj388pZ1nTcBDlc9jTxh2dvWJxOJoraWrTxngdknGXxAEQSgNRDEIZUXQ4afPxeNv9erf329M\n5D1gfl8yuzbt+vWV3hyKexMFtX63K5HxD00s459pcm/A66bK73Fk/N343Al7kZVF9kvGv6TxuF3S\n1UcQBEEoCUQxCGWFM8sfjIwvpizh32UJ/wHj++zaQNr16yq8ORX3Wll2v9dl226sjH8hJveGIjH8\nHpch/IeNeHwpA7yseQIywKu08bhUko1LEARBEIqFCH+hrHBm+XPx+GfK+GcT/uNZfSIxjddjiG2f\nI+M/bGf88x3gZXwMU4t7/R431X633boztY+/tV9p51naGBl/Ef6CIAhC8RGPv1BWOLP8uVh9ugfN\njP9AQvhXeN3UVqT/06+v9NFxeDTrNp2+ep9nrPDPt52nmfBPsfrE8HtdSdvypxQU2xl/sfqUNEYf\nf7H6FIt/vf81Xtzbx8LmqmKHIgiCUHREMQhlhZXlV2r84t54XNuFsVbGf/9AkNl1Acz5E2Ooq/CM\n384zmvD4O4X/iBlPvhl/pZRZAJoQh6FInIDHnST8U60+Icn4lwVi9SkufaMR+06fIAjCTEcUgzDl\naK05OFiYE68l/GsD3qRC33T0j0bsLLrl7e/qD2a0+YDRy79/NEI8izXDaucJpvC3u/pMLOMPhs8/\nmjS518j4V/ucGX+3LfJDjoy/tPMsbTxumdxbTFwquWOWIAjCTEYUgzDlfOuxbZx162PjFs3mgmXv\naaj0jpvxt/z9PrfLzvjt7zcy/pmoq/AS1zBkivh0OK0+fo/bntw7ErLaeeYv/D0uZV9sxOKaSEzb\nxb0WPo/ZQtTtIhJLdPWRjH9p43G5pJ1nEVEoEf6CIAgmohiEKWV//yi3P7aNcCxOrynEJ4Pl8a+v\n9I1b3Ntt7m/pnBoODASJxY07D1mFf6UXgP4sLT0jUW177Z3FvUOmx7/Cm5/VB8CtEllha3sBr1Hc\na+H3JNuLrPWkj39pYwzwEo9/sdjePUTXwOT/9wiCIEwHRDEIU8q/PbTZFuuDwcxZ9FyxMv6zqnzj\nFvf2mP7+5W11hKNxdnQPEYnpcaw+pvDPcnciU3HvSDhKhddtt+fMB7c7MeTJuqBJl/F37tO6o9FQ\n5ct7f8KRQwZ4FRervkeS/oIgCCL8hSnkhT2H+fVLnaw5ehZQGOEfsq0+vnGtPlZHnxPa6wB4cW8f\nwLhWHyDrEK9ILJ6UfXf28c93aq+FxyEOre35HcW9LmWsA4m7DJ39RvehtvrMxyMUH2nnWVzeuqrN\n/uzIxAtBEGY6IvyFKePu5/ZQG/Dw6XVLABgMFsDjH054/IPR7PaJnqEQHpdiyewaAF6yhH+2jH+l\nkT3PlvGPJHn8kyf35ju118KlnMLfOMaA12UPA7P8/dbjcCxOZ98obpeipUaEfyljdPURq0+xcClF\nTNL9giAIgPTxF6aQQ8MR2hsqaTWF9kAhhH8khselqA54CEfjxOI6o7WmZzBEY7XPzoi/tMcQ/nNy\nyfiPZm7p6ZzcOzbjP7GPlMfR1ceyRvk97oS9x+Hj97oV4Wic/X1Gh6KJWIuEI4d09SkuLqXQGuQ3\nIAiCIBl/YQoZCEaoq/BQEzDEdCGsPsFInIDXbRfQZivw7RkK0VTtp7naj0vBlq5B3C5FY7U/43vq\nK3Ox+ujkjH8sMcCrKs8e/hZud6Krj5Xx93tc9vb8joJhn8dNyLT6ZLuIEUoD6eNfXKwLY+nsIwiC\nIMJfmEIGRiPUBrzU+D0oBQMFKu4NeN1UmII4W4Fvz1CY5ho/HreL5ho/sbimpcafNUMe8Lrxe1wM\njFPc6/OM7eozHI5ROcGMv7Orj+3xd0zudWb8fR6jnWdnX5C2+ooJ7U84cnjc0s6zmFgf92yzOQRB\nEGYKIvyFKWNgNEJthReXS1Ht8xTE4x+KxAh4XQTyyPhDwtefrbDXoq7CO25xb9rJvZPJ+DuLeyOJ\ndp6W8Pd7Ex9Vv9tFKBrjQH+QOVLYW/J4XIpIXDz+xcJlZ/yLHIggCEIJIMJfmDIGglHbM18T8BSs\nnWeF1z2u8NdaJwl/q84gW2GvRX2lN3txbzTDAK9JefxdRE1x6GznWZ0h47+/P0g4FqetTjL+pY7b\nZXjMJeNcHFxmUbwU+AqCIIjwF6aIaCzOUChKbcAS/t6CZPyDltXHFP6j4fSZ1P7RCJGYpqna6NJj\neeFzzvhnK+6NxfE62nnGtXG8g8EIlZPK+BuPk9t5pvP4u+g4bLXyFOFf6lgXiVLgWxzcpvCXCy9B\nEAQR/sIkGQ3H+PrDWxkOJWfzrex+bYWRsa4JeBgYLVzG3xb+GTL+1nCr5hoz41+Xe8a/rsKX0eqj\ntU4q7rW67uzvDzIQjDKvoTKPo0lgCH9D8DvbeVaZ7UH9zoy/wzMuxb2lj1VTEhW7T1FwSXGvIAiC\nzbQV/rt6hjk0nDlrKyToGgjS2Tc6ofc+s7OXbz76Bvdv6kxabrXuTGT8PQyGCtHOM07A56bC5zKf\npxf+3YPG796y+uST8a+v9GYs7o2Y3Vl87kRxLyRmBCxvq83pOFJxZ2jn6XIpKn3uJI+/dbEBkvEv\nBzy28BfhWQys4l4ZpSAIgjCNhf/7f/gc/3r/a8UOoyz4zH0v88lfvDSh9/YOGQL7z1u6k5Zb2f2E\nx99bsMm9AY8Lvye7xz8147+4tQaXMr6Ph2H1yST8DfWQmvF/Yc9hAJZNUPh7XMrOSDrbeQJU+T0p\nffyNxwGviwaz/ahQutjCX1p6FgXrjouWjL8gCML0HOAVj2v2Hh61i7qE7Ow5NJK1LWY2ek2B/Zc3\nepIm2lrFsbWm8K+tKGBxry/RznM84W9l/Je31fHi5y+yL0SyUV/hZSQcIxyNJ2XXISH8reWWOH9x\nTx/t9RX25N98cTl6vTvbeVrxONuEWvtuq6uwp/kKpYvH9vhLyrkYKCnuFQRBsJlwxl8pNU8p9ZhS\n6jWl1KtKqY+by7+olNqnlHrJ/LqkcOHmRu9wmFhcs7N3eIz3XBhL91DIztznS69ppxoMRXlh92F7\nuW31sT3+RnHvZLNuwUiMgMdZ3JtZ+LtdinqH0M9F9APUmVn0dJ19rNadqRn/1zoHJmzzASMrnNrO\n07qr8bV3ruBTaxfb61oXG9LKszyQjH9xsYp7ZZaCIAjC5Kw+UeBTWutlwGnADUqpZeZr39BarzS/\nHpx0lHnSNRAEQGvYfGDgSO++rAhFY/SNRBiNxBgJ53+R1DMUYlaVD49L8ZjD7mN55J3tPCMxbWez\nJ8po2Mz4j1Pc2z0YorHKZxf25YMVc3+azj7WlF6fOznjH47FJ2zzAbO417woCkZjeN3KtiicOLee\nBU1V9rrOjL9Q+lgZfxGexcFyyUnCXxAEYRLCX2u9X2v9gvl4EHgdaC9UYJPh4GDQfvxqpwj/bPQ4\nMv0Tyfr3DoWZ11DB6gUN/HnLQXu5bfVxtPOExJ2AiRKMxvF7XQ6rT/oLie7BkO3vzxfLrrNxbz+b\nDwwkCTaruNdrTe51WIGWt9VNaH8wdoCXle1Ph3XRMUcKe8sCK+MfkerSoqAk4y8IgmBTkOJepdQC\nYBXwrLnoo0qpTUqpHyilGgqxj3zoGjD83R6X4tV9IvyzcXAgcZFk+eLzoXc4RGO1n3OXtLD5wCAH\n+o3tDQQjuM2ONAC1AcPyM5mWnrG4JhyNU+F125n2TBn/AwOhCbe6bDEvGD51z0bW/eeT3PnkDvu1\n1OJep0CfrNUn4fE3phNnIpHxF6tPOWDduRHhWRzsPv6S8hcEQZi88FdKVQP3Ap/QWg8A3waOAVYC\n+4GvZXjfdUqp9Uqp9d3d3elWmTCW1eek+Q28ur+/oNuebnQPJsT+RDP+jVU+zlvSAsATW43f5cBo\nlNqAx8621ZjCP3WI122/38w3H30jp31ZhbwBrxulFAGvK2Nx74H+UXtab74snV3D/35wDd+5+mSa\nqn1s7Rq0X7M8/r4Uj39DpXdSPfWdGf/geBl/S/hLxr8s8LqlnWcxsSx0cuElCIIwSeGvlPJiiP6f\naa3vA9Bad2mtY1rrOHAncGq692qt79Bar9Zar25ubp7Q/h95rYub7900ZnnXgOHvXjWvnq0HhuQW\nexYOOoX/cH4Zf621Ifyr/SxurcbncbG9ewgwrD7OYlrL6pPa2ed3mzq565ndORX9WiLf8vdXeN1p\ni3uDkRiHRyITFuJKKc5Y1MS642ezoLGKfYcTMw4sj789ude8AFjeVjepDjtOj38oGrPvaKTD2meb\nFPeWBW6X2dVHinuLwncf3w7AekfzAUEQhJnKZLr6KOD7wOta6687ls9xrHYl8MrEw8tOx+ER7n5+\nL284MrIA3YNBWmoDLGurJRyLs+3g0FSFUPY4M/49eWb8B0NRwrE4TdU+lFLMqQuwzxwENhCM2K08\nIeH1dwr/WFyzvy9I92CInT3D4+5vNJ3wT5Pxt+74TDTj72RuQwUdDuEfyZDxn4zNBwxxaHv8o3H8\n3swZ/1VH1fOmY5uYN2tiU4KFI4vHLZN7i0m+/9cEQRCmM5PJ+J8JXAOcn9K68zal1MtKqU3AecAn\nCxFoOi45cQ4uBb/btD9peddAiNZav11sKQW+mekeMu6OVPs9eVt9rPUbq41i2Dl1AfZbHv/RiC32\nIb3Vp2sgaNsfntt5aNz92RNtvdYAK3daq49VZzCnAF1v2hsqODAQJGpm+u3iXlP4N1X78bgUa46Z\nNan9eFzKFobBSPaM/6qjGrjr2jVZ7UBC6SCTe4vL2YsndkdZEARhOjKZrj5/0VorrfWJztadWutr\ntNYnmMsv11rvH39rE6OlJsBpxzRy/8bOJKtI10CQ1poARzdVUeF182qn+PwzcXDA6H7TWO3L2+pj\nDe9qrDKKYdvqK9hvZ/yjKVYfS/gnMv7W3QGAZ3MS/skZf0v4DwQjnP7VR+2uQgfMjP/suol19XEy\nt6GSWFzTZd4ZSRT3GmKuucbP+n+6kPOXtk5qPy6lsBLCoWg8q/AXyguPWH2KylWnzgNg3iypiREE\nQSh7dfGWE9vY0TNsZ/WjsTg9Q0bG3+1SLJ1Tc0Qy/sFIjJvu2cjeQyNTvq9C0j1kCv8qX04Z//s3\ndfI9s8tNT0rGv62ugq7BENFYnP7RiD28C6DK50Gp5HaeHYeNn9XS2TU8u6N3XJ+/s7gXoMJnWH1e\n7xxgf3+QZ3YYFw9Wxn92ITL+ZgFth/l7DadM7gUmPK3XiTPjP57VRygvxOpTXOyuPvLjFwRBKH/h\nv+742Xhcit9t6gSMSbJxDS2mv/uE9jpe3dc/5R0dNnX0c8+GDh56ZcpucEwJ3QNBWmoCNFb7c2rn\n+b0nd/Ktx7YZhb3mHYKmaiOzPqc+QCyuOTgYGmP1cbkU1X5Pcsbf9M6/7aR2OvuDSV76dNgef19y\nca/VdccqLN7fH6Ta76Ha70m/oTxobzCEv3V3IrWrT6Fwu519/GMEJOM/bRCrT3GRdqqCIAgJyl5d\nzKrycdaxTdy/cT9a6zGFnSvn1TMcjvHGwcFsm5k0W0zxueVA+RQSa63tjH9TtY/e4ewZ/1hcs/nA\nAIdHInQPhew7BA1mxttqL7mrd5hQNJ5U3AtGga8z47+vb5TGKh/nLDZagT6zozfr/q0OPgGP0+oT\nt3/2lvDvGggyu0A97u2Mv3lRktrHv1B4nAO8JOM/rRCrz1iUUl9USu1LqQ+bEtxy4SUIgmBT9sIf\nDLvPvr5RNnb0c9Ac3mUNYVo5rx6Al/b0TWkMWw8Y4nNr19ReYBSSvpEIkZg2rT5+Dg2HiWc5Oe7o\nHrILbLceGKJ3KERdhdcxUMoQyVvMn0Wq8K8JJGf8Ow6PMrehgmNbqqmv9I7r8w+a2fYKn1Xca/Tx\n32pebO3pHSESi7O/P8jsAnT0Mfbhpqnab9+diKS08ywULqVsYRIap7hXKC8SGWfxmqTwDWd92FTt\nxPr5ywAvQRCEaSL8z1/aglLw2OaDdA0mZ/yPbqqirsLLS3unVvhbWec3Dg6WzS3l7qHERVJjtY9Y\nXNM/Gsm4vrNWYkvXID3DYdvfD4bVB2DzflP4B5KtNrUBb1JXn32HR2lvqMDlUpy6YBbPjOPzD5oZ\nf6ubTYXXzUg4xpauQWoDHqJxze7eEaO4u0DCH4yWnrbVx+7qM/Ge/elIzfhnm9wrlBcywKu4WBfr\nh8a5oykIgjATmBbqYlaVj5Xz6vnz1m66BkIoBU2mIFVKsWJe/ZQKf601W7sGqfIZ1pNyKfC17o4Y\nXX2MOyTZOvu82tmPz+OiodLL1gOD9A6FaKpKdM6pDXip8XvYfMC4QMiW8Y/HNR19o8xtMHrRn7e0\nhY7Do1kLsYPRFI+/z83BwSD9oxHWLpsNwBtdgxwcDE1qim4q7Q0VdiFyah//QuF2JzL+RjtPsfpM\nF2yriVh9UvmoUmqTUuoHSqmGqdrJwGjiLmOnWfgvCIIwU5kWwh/g3MUtbOro4/X9A0ZvdYcwWzmv\nnq1dgwyHolm2MHG6B0P0jUS4aLkhPreUid2ne8g4CbbU+GmqMi6Usg27ebVzgKWza1g6u5bNXYPm\n1N7kjjZz6gNs7TKsN3VphL/l8e8ZDhGOxm0P/brlyUXa6bA8/s4BXlYS9eLjjZ/9szsPEYtrWgso\n/OfWV9DZFyQe12m7+hQCt1K2zUraeU4vrHqQmZbxV0o9opR6Jc3XFcC3gWOAlcB+4GsZtnGdUmq9\nUmp9d3f3hOKwLrwEQRCE6ST8lzSjtWH3aa1N7t++al49cQ0v75uafv6W0L/0BGNoseX3L3XSZvwz\nCH+tNa92DrC8rZYls2t4o2uQnqHQWOFfV2F333F29QGoCXjtjL/lmbeEf0OVjzc5irTTYdUXWO08\nnQWwq46qZ3ZtgKe29RhxFNjqE47F6R4K2Rn/qSjujcY10VicaFzbxyiUP4mM/8zy+GutL9RaH5/m\n6zda6y6tdUxrHQfuBE7NsI07tNartdarm5snNojLI8JfEATBZtoI/xPa62is8hGNa1prkkXfCqvA\nd4rsPlYx66qj6pk3q6J8Mv6DISq8bqr9HlvAZ7L67OsbpX80wrK2Oha31jASjnF4JGIP77KwOvsA\nSX38IWH10VrbXXLmOobqXLbCKNJ+IUMh9mgkhs/tsoWUlflvqjYuXBa2VPHGQeNuQ6G6+kCipWfH\n4VHbL1xoMeE2O79YF02S8Z8+NFX7eeBjZ7HOvCslgFJqjuPplcArU7Uvlwh/QRAEm2mjLlwuxTnm\naPaWlGzvrCof8xsreWlPH09s7ebjd79oD3kqBFu7Bmmq9tFY7WdJa03ZdPaxWnkqpWio9KFUZquP\n5b03Mv7V9vKmlIx/m0Nwp8v4x+Ka0UjMLpZtd1worF3Wis/j4ncbO9mw+zCf+uVGfueYyhyMxPA7\nil4rzMdWPAubE3EVVPjXG3UI+/pGCcc0PrcLpQot/I3vQ6YdTYT/9MHncbG8ra4gg96mEbcppV5W\nSm0CzgM+OVU7koy/IAhCgslPOCohzl3awn0v7htj9QFYMbee+zd18vtXDwCgNXzzqlUAbNh9mLoK\nL4taqse8Lxe2dA2xuLUGgMWtNfx5SzfhaLzgPvBCc3AgZLc9dbsUsyp99GYY4vVq5wBKGVN2nV5l\nyyJkMccU8n6Pa4xdpcbs8jMYjNJxeITagIcax8VBTcDL+Uta+N/n9vCjp3fhdSvufaGDu57Zza1v\nO4FgJGZn+SFR5Gv97C3h73Ubx1IoEhn/EUbD0YJ39AFY1GIcw8OvdQFIH39hWqO1vuZI7auhSi64\nBEEQLEpbmebJOcc201rr58S5dWNeu3BZKzUBL/+4binXn7OQ327sZMPuQzy1rYe//e5fed8PniNo\n2izyIR7XvNE1aIvPJaYw3tkznHb9wyXUUs7K+Fs0Vvtsj79z0BbAa50DHNNURaXPQ23Aa2f2G6vS\nZ/xTO/o4lw0GI+w7nOjo4+Tda47C53Zxw3kL2fC5tXz5yuPZ2jXI1d97lj2HRpIuJqzHS1KEf2tt\noKC396v9Huorvfzk6d385JndLJzgBWI2Ljyuhba6AHc+uQNA2nkKQoGYP2vs/xlBEISZyrRSF3WV\nXp79zIWcv7R1zGuXr2hj4xcu4h/OXchHz19Ea62fW+57met/uoGWGj/7+kb5nim68mFf3ygj4RhL\nZicy/pC+s89vXtrHqi89zPV3bShqy8/hUJTbfr+ZnT3DzG1IWG0aq/z0Dof49p+3s+Kf/8h9L3QA\nsLt3mGd39nJCe+KCarF5vKkZf8vjn9rDHxIZ//7RKPv6Ru1MupOzFzfzyj+/mZvevJTagJf3rJnP\nT69dQ99ohKe39yZl/GeZFx3L24y4FrZUARRseJeThc3VdA+F+MAZR3PXtWsKvn2P28U1py9g7yHD\nAiXtPAWhMBTalicIglDOTCurT65U+T3847ql3PjLjTRV+/nl9afzpftf43/+vJ13rJ43ZvjTU9t6\n+MbDW7nypHbes2a+vTwYifGjp3cBsLjVyAIf01yF26W4d0MHZyxspMkUxsOhKF9+4HXa6yt4fGs3\nf9p80M62n3ZMI59etyTvoVO/f+UAP3hqJ9/425VJXnmL3qEQX3t4K49vSW6DNzAaYTAU5cpV7Xz4\n3EX28sZqH4+83sXzuw5T4/fwj/duotLn4bY/bMbtUnzsgmPtdZeYlqbUjL/lrU9t5QkJz/+H7lrP\noeEwZyxsyuk4j2+v47+vWsXf/2Q9AV9CEJ+5sIlf33AmJ5h3eGbXBqjyuQvaytPim1etIhbTHNU4\nddnDd50yj/98ZKu08xSEAiKyXxAEIcGMFP4Ab13ZTvdgiHOWNDO3oZLPXrKMC7/+ONf/dAPL5tTa\n63UcHuXxrd34PS427DlMc7Wftcta+eNrXfzrA6+x99Aol544hxVzjc5Bfo+bG9cu5hsPb+W8//gz\nn7hwMe89fT7feXw7BwdD3PsPZ9BWH+D7T+6kbzRCMBLjdxs7eeiV/Vx6wpxx6wJWL2jgihXtvLi3\nj4/d/SLhaJxrf/Q891x/OnENP356F10DQWJxzQMv72c0HOOi5a1U+hK/aq9b8faT53Hy/OSZOU3V\nfoKROKvnN/Dtq0/mqjuf4fqfbsDndvHTD67hGEfx7HvWzKe5xj/GPxvwumms8qW1+hzfXssHzlzA\nYDCKS8G7Tp2X8+/rguNauf3dJ+FyZO9cLsVKs2MTGJm9L731eI5uqsp5u7mS7sKq0DRU+bhyVTt3\nP79X2nkKQoGQhL8gCEIClaln+pFk9erVev369cUOgx8+tZNvPbYdSPxMvG4XV582n6vXzOe9P3iW\nrV1DrJhXxzM7DrG4tZovXLacMxeNzVxvOzjIv9z/Ok9s7WZhcxUdh0dZd/xs/utdq8asu7t3mK8+\nuJn1uw9ljS8S0/SPRlgxr56OQyNUBzx86qIlfPIXL3F8Wy0dh0c5NBK2s/Anzq3nM5cstQtHx+P3\nrxzgB3/ZyXeuOZlZVT72Hhrhoz9/kWvPOprLVrTltA2AL/72VeY3VvKBM4/O+T2CwfbuIT5x90t8\n732r874DJExflFIbtNarix1HMZnMeWLBzQ/Yj3fdemmhQhIEQSgJ8jlHiPDPg4ODQa781tMMBiPc\nuHYxV582P2lCcCpaax59/SBfeuA1egZDPHzjOUl97vMlHtf8+qV93PrQZsKxOPf9wxkc01zN3c/t\n4eb7XuaUBQ184bLlHN8+trhZEITyRYT/5M4Ta7/+OG8cHOJHHziFc5e0FDgyQRCE4iLCfwoZNLvd\n1ATGWlkyEY7GGQxGxhTCTpTRcIxgJJZksznQH6S11i+FbIIwDRHhP/nzxKHhsN0QQBAEYTqRzzli\nxnr8J0o+gt/C53EVTPSD0b++wpfsAS/kwCpBEITphoh+QRCEadbOUxAEQRAEQRCE9IjMBjowAAAH\n5klEQVTwFwRBEARBEIQZgAh/QRAEQRAEQZgBiPAXBEEQBEEQhBnAlAl/pdQ6pdQWpdQ2pdTNU7Uf\nQRAEQRAEQRDGZ0qEv1LKDXwLuBhYBlyllFo2FfsSBEEQBEEQBGF8pirjfyqwTWu9Q2sdBu4Grpii\nfQmCIAiCIAiCMA5TJfzbgb2O5x3mMkEQBEEQBEEQikDRinuVUtcppdYrpdZ3d3cXKwxBEARBEARB\nmBFMlfDfB8xzPJ9rLrPRWt+htV6ttV7d3Nw8RWEIgiAIgiAIggCgtNaF36hSHmArcAGG4H8eeLfW\n+tUM63cDuye4uyagZ4LvLQblFi+UX8wS79Qi8U49qTHP11rP6AzJDDtPTBY53umNHO/0ZiLHm/M5\nwpN/POOjtY4qpT4C/AFwAz/IJPrN9Sd8QlNKrddar57o+4805RYvlF/MEu/UIvFOPeUY81Qzk84T\nk0WOd3ojxzu9merjnRLhD6C1fhB4cKq2LwiCIAiCIAhC7sjkXkEQBEEQBEGYAUwH4X9HsQPIk3KL\nF8ovZol3apF4p55yjLmUmWk/Tzne6Y0c7/RmSo93Sop7BUEQBEEQBEEoLaZDxl8QBEEQBEEQhHEo\na+GvlFqnlNqilNqmlLq52PGkopSap5R6TCn1mlLqVaXUx83ls5RSDyul3jC/NxQ7VidKKbdS6kWl\n1P3m85KNVylVr5T6lVJqs1LqdaXU6SUe7yfNv4VXlFI/V0oFSi1epdQPlFIHlVKvOJZljFEpdYv5\nGdyilHpzicT77+bfxCal1P8ppepLOV7Ha59SSmmlVJNjWVHjLXdK/TyRCxM5l2T6u1FKnayUetl8\n7ZtKKVWMY8qFfM5F5X68+Z7LpsHx5nUuLLfjLdR5NNPxKaX8SqlfmMufVUotyDk4rXVZfmG0Cd0O\nHAP4gI3AsmLHlRLjHOAk83ENxmyDZcBtwM3m8puBfyt2rClx3wj8L3C/+bxk4wV+DHzQfOwD6ks1\nXqAd2AlUmM9/Cby/1OIFzgZOAl5xLEsbo/n3vBHwA0ebn0l3CcR7EeAxH/9bqcdrLp+H0QJ5N9BU\nKvGW81c5nCdyPI68ziXZ/m6A54DTAAU8BFxc7OPLctw5nYumw/GSx7ms3I+XPM+F5Xi86f7PF/L4\ngA8D3zEfvwv4Ra6xlXPG/1Rgm9Z6h9Y6DNwNXFHkmJLQWu/XWr9gPh4EXsf4g78C40OO+f2txYlw\nLEqpucClwPcci0syXqVUHcaH6/sAWuuw1rqPEo3XxANUKGPIXSXQSYnFq7V+AjiUsjhTjFcAd2ut\nQ1rrncA2jM/mESNdvFrrP2qto+bTZzCmh0OJxmvyDeDTgLPwqujxljklf57IhQmcS9L+3Sil5gC1\nWutntKEYfkJp/X+0yfNcVNbHO4FzWVkfr0k+58KyO95CnEfHOT7ntn4FXJDr3Y5yFv7twF7H8w5z\nWUli3oZZBTwLtGqt95svHQBaixRWOv4TQ3zEHctKNd6jgW7gh+bt4O8ppaoo0Xi11vuA/wD2APuB\nfq31HynReFPIFGM5fA7/DiNTAiUar1LqCmCf1npjykslGW8ZMe1+fjmeSzIdd7v5OHV5KZLPuajc\njzffc1lZH+8EzoVlfbwOCnl89nvMJFc/0JhLEOUs/MsGpVQ1cC/wCa31gPM18yquJForKaXeAhzU\nWm/ItE4pxYuRMTgJ+LbWehUwjHH7zKaU4jX9fFdg/JNvA6qUUlc71ymleDNRDjFaKKU+C0SBnxU7\nlkwopSqBzwCfL3YsQmlTLueSyVKG56LJUlbnsskyXc6Fk6GYx1fOwn8fhifWYq65rKRQSnkx/lH/\nTGt9n7m4y7yFg/n9YLHiS+FM4HKl1C6MW+LnK6V+SunG2wF0aK2fNZ//CuOfZ6nGeyGwU2vdrbWO\nAPcBZ1C68TrJFGPJfg6VUu8H3gK8x/wnC6UZ70KME+BG87M3F3hBKTWb0oy3nJg2P788zyWZjnsf\nCdubc3mpke+5qNyPN99zWbkfb77nwnI/XotCHp/9HtMuVQf05hJEOQv/54FjlVJHK6V8GMUNvy1y\nTEmYfqvvA69rrb/ueOm3wPvMx+8DfnOkY0uH1voWrfVcrfUCjJ/nn7TWV1O68R4A9iqllpiLLgBe\no0TjxbiteZpSqtL827gAw6tbqvE6yRTjb4F3mR0GjgaOxShGKipKqXUYNoHLtdYjjpdKLl6t9cta\n6xat9QLzs9eBUch5gBKMt8wo+fNELkzgXJL278a0GQwopU4zt/leSvD/zQTOReV+vPmey8r6eMn/\nXFjux2tRyONzbuvtGJ+R3O4g6BKofp7oF3AJRneD7cBnix1PmvjOwriVswl4yfy6BMOH9SjwBvAI\nMKvYsaaJ/VwSnRRKNl5gJbDe/Bn/Gmgo8Xj/GdgMvALchVHFX1LxAj/H8F1GMETotdliBD5rfga3\nUISOChni3Ybhf7Q+d98p5XhTXt+F2dWnFOIt969SP0/keAx5n0sy/d0Aq83/P9uB2zEHeZbqV67n\nonI/3nzPZdPgePM6F5bb8WY4LxXs+IAAcA/Gue454JhcY5PJvYIgCIIgCIIwAyhnq48gCIIgCIIg\nCDkiwl8QBEEQBEEQZgAi/AVBEARBEARhBiDCXxAEQRAEQRBmACL8BUEQBEEQBGEGIMJfEARBEARB\nEGYAIvwFQRAEQRAEYQYgwl8QBEEQBEEQZgD/H5FMnT+dpBjrAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f697fb51150>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "num_frames = 10000\n",
    "batch_size = 32\n",
    "gamma      = 0.99\n",
    "\n",
    "losses = []\n",
    "all_rewards = []\n",
    "episode_reward = 0\n",
    "\n",
    "state = env.reset()\n",
    "for frame_idx in range(1, num_frames + 1):\n",
    "    action = current_model.act(state)\n",
    "    \n",
    "    next_state, reward, done, _ = env.step(action)\n",
    "    replay_buffer.push(state, action, reward, next_state, done)\n",
    "    \n",
    "    state = next_state\n",
    "    episode_reward += reward\n",
    "    \n",
    "    if done:\n",
    "        state = env.reset()\n",
    "        all_rewards.append(episode_reward)\n",
    "        episode_reward = 0\n",
    "        \n",
    "    if len(replay_buffer) > batch_size:\n",
    "        loss = compute_td_loss(batch_size)\n",
    "        losses.append(loss.data[0])\n",
    "        \n",
    "    if frame_idx % 200 == 0:\n",
    "        plot(frame_idx, all_rewards, losses)\n",
    "        \n",
    "    if frame_idx % 100 == 0:\n",
    "        update_target(current_model, target_model)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<p><hr></p>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h1>Atari Environment</h1>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [],
   "source": [
    "from common.wrappers import make_atari, wrap_deepmind, wrap_pytorch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "env_id = \"PongNoFrameskip-v4\"\n",
    "env    = make_atari(env_id)\n",
    "env    = wrap_deepmind(env)\n",
    "env    = wrap_pytorch(env)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [],
   "source": [
    "class CategoricalCnnDQN(nn.Module):\n",
    "    def __init__(self, input_shape, num_actions, num_atoms, Vmin, Vmax):\n",
    "        super(CategoricalCnnDQN, self).__init__()\n",
    "        \n",
    "        self.input_shape  = input_shape\n",
    "        self.num_actions  = num_actions\n",
    "        self.num_atoms    = num_atoms\n",
    "        self.Vmin         = Vmin\n",
    "        self.Vmax         = Vmax\n",
    "        \n",
    "        self.features = nn.Sequential(\n",
    "            nn.Conv2d(input_shape[0], 32, kernel_size=8, stride=4),\n",
    "            nn.ReLU(),\n",
    "            nn.Conv2d(32, 64, kernel_size=4, stride=2),\n",
    "            nn.ReLU(),\n",
    "            nn.Conv2d(64, 64, kernel_size=3, stride=1),\n",
    "            nn.ReLU()\n",
    "        )\n",
    "        \n",
    "        self.noisy1 = NoisyLinear(self.feature_size(), 512)\n",
    "        self.noisy2 = NoisyLinear(512, self.num_actions * self.num_atoms)\n",
    "        \n",
    "    def forward(self, x):\n",
    "        batch_size = x.size(0)\n",
    "        \n",
    "        x = x / 255.\n",
    "        x = self.features(x)\n",
    "        x = x.view(batch_size, -1)\n",
    "        \n",
    "        x = F.relu(self.noisy1(x))\n",
    "        x = self.noisy2(x)\n",
    "        x = F.softmax(x.view(-1, self.num_atoms)).view(-1, self.num_actions, self.num_atoms)\n",
    "        return x\n",
    "        \n",
    "    def reset_noise(self):\n",
    "        self.noisy1.reset_noise()\n",
    "        self.noisy2.reset_noise()\n",
    "        \n",
    "    def feature_size(self):\n",
    "        return self.features(autograd.Variable(torch.zeros(1, *self.input_shape))).view(1, -1).size(1)\n",
    "    \n",
    "    def act(self, state):\n",
    "        state = Variable(torch.FloatTensor(np.float32(state)).unsqueeze(0), volatile=True)\n",
    "        dist = self.forward(state).data.cpu()\n",
    "        dist = dist * torch.linspace(Vmin, Vmax, num_atoms)\n",
    "        action = dist.sum(2).max(1)[1].numpy()[0]\n",
    "        return action"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [],
   "source": [
    "num_atoms = 51\n",
    "Vmin = -10\n",
    "Vmax = 10\n",
    "\n",
    "current_model = CategoricalCnnDQN(env.observation_space.shape, env.action_space.n, num_atoms, Vmin, Vmax)\n",
    "target_model  = CategoricalCnnDQN(env.observation_space.shape, env.action_space.n, num_atoms, Vmin, Vmax)\n",
    "\n",
    "if USE_CUDA:\n",
    "    current_model = current_model.cuda()\n",
    "    target_model  = target_model.cuda()\n",
    "    \n",
    "optimizer = optim.Adam(current_model.parameters(), 0.0001)\n",
    "update_target(current_model, target_model)\n",
    "\n",
    "replay_initial = 10000\n",
    "replay_buffer  = ReplayBuffer(100000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fce24983450>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "num_frames = 1000000\n",
    "batch_size = 32\n",
    "gamma      = 0.99\n",
    "\n",
    "losses = []\n",
    "all_rewards = []\n",
    "episode_reward = 0\n",
    "\n",
    "state = env.reset()\n",
    "for frame_idx in range(1, num_frames + 1):\n",
    "    action = current_model.act(state)\n",
    "    \n",
    "    next_state, reward, done, _ = env.step(action)\n",
    "    replay_buffer.push(state, action, reward, next_state, done)\n",
    "    \n",
    "    state = next_state\n",
    "    episode_reward += reward\n",
    "    \n",
    "    if done:\n",
    "        state = env.reset()\n",
    "        all_rewards.append(episode_reward)\n",
    "        episode_reward = 0\n",
    "        \n",
    "    if len(replay_buffer) > replay_initial:\n",
    "        loss = compute_td_loss(batch_size)\n",
    "        losses.append(loss.data[0])\n",
    "        \n",
    "    if frame_idx % 10000 == 0:\n",
    "        plot(frame_idx, all_rewards, losses)\n",
    "        \n",
    "    if frame_idx % 1000 == 0:\n",
    "        update_target(current_model, target_model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
